[swift] 일러스트를 통해서 알 수 있어요!class와 struct의 차이 [초보자용]

개요
👨‍🏫"여기는 struct로 썼는데, 무슨 의미가 있습니까?"
🙍‍♀️「!」
🙍‍♀️상수만 열거했기 때문에 struct가 비교적 좋다고 생각합니다.
👨‍🏫"ㅋㅋ"
🙍‍♀️나는 솔직하게 말하고 싶었지만 별 의미가 없어서 struct를 선택했다.
👨‍🏫"ㅋㅋ"
이런 일이 있어서.
각자 뭐가 다른지 다시 정리를 해봤어요.٩( 'ω' )و
각각의 특징
우선 각자의 특징을 간단히 확인해 보자.
이미지 참조@lovee 기사.

포인트는 참고형인지 값형인지.🤔
그리고 코드를 쓴 후
struct
struct test {
    let cat: String
    let dog: String
}
/// -> 怒られない
class
class test {
    let cat: String
    let dog: String
}
/// -> 💥怒られる: Class 'test' has no initializers
반의 학우들은 초기화해 주십시오!이렇게 혼나고
설치를 해보세요. 달라요.
class Cat {
    var like: String = "魚"
}
struct Dog {
    var like: String = "肉"
}
반에서 하는 물고기 좋아하는 사람.🐱유산으로 만든 고기랑 좋아하는 거.🐶.
let tama: Cat = Cat()
let pochi: Dog = Dog()

func initWithData(_ data: Cat) {
 var data = data
 data.like = "マタタビ"
}

func initWithData2(_ data: Dog) {
 var data = data
 data.like = "マタタビ"
}

initWithData(tama)
initWithData2(pochi)
이것저것 가지고 와서 보여드리면...
print(tama.like) // →"マタタビ"
print(pochi.like) // →"肉"
이런 결과.🐱내가 좋아하는 것은 생선에서 매운 생선으로 바뀌었다.
이 집행 결과를 보면
class🐱참조 배송var data = data에서cat() 자체가 교부됨var tama: cat = cat() 자신에 대한 개작
struct🐶실가로 납품했으니까.var data = data에cat()의 복사본 만들기var pochi: dog = dog() 스스로 다시 쓸 줄 모른다٩( 'ω' )و
너 그거 알아?init를 사용하여 초기 값을 입력할 수도 있습니다.
class Cat {
    var like: String
    init(like: String) {
        self.like = like
    }
}
struct Dog {
    var like: String
    init(like: String) {
        self.like = like
    }
}
let tama: cat = Cat(like: "魚")
let pochi: dog = Dog(like: "肉")
하지만 이런 상황에서
let tama: cat = Cat(like: "魚")
tama.like = "肉" // →"肉"
let pochi: dog = Dog(like: "肉")
pochi.like = "魚" // ERROR
.struct🐶나의 취향은 매우 강렬하다.
이것은 struct의 가격 양도이다. 예를 들어 말하자면

솔리드(= 참조 class🐱)직접 수정할 수 있지만...
사진(= 값형 struct🐶)직접 가공할 수 없다(사진부터 올리는 가공.)
이런 인상은 괜찮아요.٩( 'ω' )و
공식 문서
애플공식 문서에는 struct는 다음과 같은 장소에서 사용하고, 이외에class를 사용하는 것이 좋다고 적혀 있다.(의역)
  • struct의 목적은 상대적으로 간단한 데이터 값을 봉인하는 것이다
  • 실례를 대입하거나 인수인계할 때 봉인 값이 참고 값이 아닌 복사됨
  • struct에 저장된 속성은 모두 값형이고 참조가 아니라 복제
  • struct는 다른 기존 유형에서 속성과 동작을 계승할 필요가 없습니다.
  • ... 하는 김에
    참고로 원래 발단으로 되어 있던 코드는 다음과 같다.
    /// カラーの拡張(各所で、'let xxx = UIColor.mainGreenColor()'などと呼ぶ)
    extension UIColor {
        // UIColorへの変換
        private func hexColor(_ str: String) -> UIColor {
            // (略)ここでカラーコード→UIColorに変える
            return UIColor(red: x, green: x, blue: x, alpha: 1.0)
        }
        // メインカラー       
        @objc static func mainGreenColor() -> UIColor {
            return self.hexColor(ColorCode.mainGreenColor)
        }
        // バッチカラー
        @objc static func badgeColor() -> UIColor {         
            return self.hexColor(ColorCode.badgeColor)
        }               
        // カラーコード
        struct ColorCode { // ←⭐️ここ   
            static let mainGreenColor: String = "#219E62"
            static let badgeColor: String = "#FF3300"
        }
    }
    
    각종 조사의 결과로
    "static만 취합된 변수이기 때문에 메모리 증가를 낭비하지 않기 위해 이런 관점도 사용하는 것이 좋다class."
    그걸 이해했어요.😇

    최후
    잘 조사하기 전에 팀에 따라 좋아하는 문제도 있다고 생각해요.
    나는 다시 한 번 이해했고, 의사도 잘 분리해서 사용할 수 있었다٩( 'ω' )و
    마지막
    delegate=self 같은 건 여러 가지가 작게 접혀있어요.
    다음 코드와 같은 CatViewData 데이터의 클래스를 제작하고 반복적으로 유지할 때
    생각 없이 사용했다struct. 그 결과 데이터가 전혀 업데이트되지 않았다(유지). 한 시간 동안 고민했다.😭!!!!!」그런 경험이 있어서.
    때로는 동작에 영향을 미칠 수 있기 때문에 이런 의미에서도 사용을 잘 고려해야 한다.
    
    /// データ保持用クラス
    // ↓structにすると、データを書き換えても値型でコピーされるだけなので、呼び直すタイミングで消えてしまう
    class CatViewData {
        var name: String
        init(name: String) {
            self. name = name
        }
    }
    
    /// VC&Table用クラス
    class TableViewDataSource: UIViewController, UITableViewDelegate, UITableViewDataSource {
        var viewData: CatViewData
    
        // ここでテーブルを更新
        func reloadTable(viewData: CatViewData) {
            tableView.reloadData()
            self.initWithData(viewData: viewData)
        }
    
        // ここでデータを更新
        func initWithData(viewData: CatViewData) {
            self.viewData = viewData
        }
    
        // ~~略~~
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CatCell") as! CatCell
        cell.setSettingCell(viewData: viewData)
        return cell
        }
    
           func reloadTable(viewData: CatViewData) {
    
          }
    }
    
    /// 表示用のセルクラス
    protocol delegate {
          func reloadTable(viewData: CatViewData)
    }
    class CatCell: UITableViewCell {
         var viewData: CatViewData
         func setSettingCell(viewData: viewData) {
              self.viewData = viewData
        }
        @IBAction func buttonTapped(sender:AnyObject) {
            self.viewData = "(textViewから入力したデータ)"
            delegate.reloadTable(viewData: self.viewData)
        }
    }
    
    간단해. 이거야.
    잘못된 점이 있으면 메시지를 남겨 주세요.

    좋은 웹페이지 즐겨찾기