07.クラスと構造体


こうぞうたい


構造体は、構造化データと機能を作成することによって、カスタムデータ型を作成します.構造体の例は値タイプです.
struct 구조체이름 {
	프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
構造体は別途作成者を作成する必要はありません.SWIFTはメンバー変数を自動的に参照して作成者を準備します.
struct User {
	// 멤버변수
	var nickname: String
	var age: Int
	
	// 멤버함수
	func info() {
		print("\(nickname) is \(age)-year old")
	}
}

var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"

user.nickname = "Albert"
user.nickname
// "Albert"

user.info()
// "Albert is 35-year old"

カテゴリ


クラスも構造体と同様に、構造化データと機能を作成することでカスタムデータ型を作成します.ただし、クラスのインスタンスは、構造体とは異なり参照タイプです.
class 클래스 이름 {
	프로퍼티(=멤버변수)와 메서드(=멤버함수)
}
クラスは、構造体と同じ方法を使用して、インスタンスがメンバー変数とメンバー関数に自由にアクセスできるようにすることもできます.
class Dog {
	var name: String = ""
	var age: Int = 0
	
	func intro() {
		print("The name is \(name), age is \(age)")
	}
}

var dog = Dog()
dog.name = "Coco"
dog.age = 2
dog.intro()
// "The name is Coco, age is 2"

初期化


クラス、構造体、または列挙インスタンスを使用する操作を初期化と呼びます.一般にコンストラクション関数と呼ばれます.
init(매개변수: 타입, ...) {
	프로퍼티(=멤버변수) 초기화
	인스턴스 생성시 필요한 설정 내용
}
初期化にはinit構文を使用する必要があります.パラメータが変化するたびに、コンストラクション関数も存在します.
class User {
	var nickname: String
	var age: Int
	
	// 멤버변수 nickname, age를 모두 사용하는 생성자
	init(nickname: String, age: Int) {
		self.nickname = nickname
		self.age = age
	}
	
	// 멤버변수 age만 사용하는 생성자
	init(age: Int) {
		self.nickname = "Albert"
		self.age = age
	}
}

var user = User(nickname: "Gunter", age: 35)
user.nickname
// "Gunter"
user.age
// 35

var user2 = User(age: 23)
user2.nickname
// "Albert"
user2.age
// 23
また,文法とは逆の文法(de-initializer)も存在する.これはinit構文と呼ばれ、インスタンスがメモリに解放される前に呼び出され、コンストラクション関数として作成されたインスタンスとそのメンバー変数の値がnullの場合、すべて回収されます.したがって、これらのdeinit構文は、「参照」メモリのクラス・インスタンス関係でのみ使用され、プログラマに必要なクリーンアップ操作が実現されます.
class User {
	var nickname: String
	var age: Int
	
	init(nickname: String, age: Int) {
		self.nickname = nickname
		self.age = age
	}
	
	init(age: Int) {
		self.nickname = "Albert"
		self.age = age
	}
	
	// de-initializer
	deinit {
		print("de-init user!")
	}
}

var user3: User? = User(age: 10)
user3 = nil
// de-init user!

保証する


クラス、構造体、列挙タイプなどに関連する値で、インスタンスのプロパティを表します.

ストレージ構成


クラス、構造体、または列挙型で宣言される定数または変数.構造で定数として宣言されたストレージ・プロシージャは、インスタンスで値を変更できません.同様に、定数として宣言されたインスタンスは、ストレージ・プロシージャの値を変更できません.
struct Dog {
	// 구조체의 저장 프로퍼티 name, gender
	var name: String
	let gender: String
}

var dog = Dog(name: "Coco", gender: "male")
print(dog)
// Dog(name: "Coco", gender: "male")
dog.gender = "female"
// Cannot assign to property: 'gender' is a 'let' constant

let dog2 = Dog(name: "Kuku", gender: "male")
dog2.name = "Tata"
// Cannot assign to property: 'dog2' is a 'let' constant
逆に、クラスは参照タイプであり、定数として宣言されたインスタンスが変数型であっても、インスタンスはストレージ・プロシージャの値を変更できます.もちろん、構造と同様に、インスタンスは、最初に定数として宣言されたストレージ・プロシージャの値を任意に変更することはできません.
class Cat {
	// 클래스의 저장 프로퍼티 name, gender
	var name: String
	let gender: String
	
	init(name: String, gender: String) {
		self.name = name
		self.gender = gender
	}
}

let cat = Cat(name: "Latte", gender: "male")
cat.name = "Jason"
print(cat.name)
// "Jason"

えんざんプログラム


これは、GetterとSetterを使用して特定の演算を実行した結果値であり、特にインスタンスでのみ演算プログラムを実行する場合にgetter構文を自動的に実行する内容である.
struct Stock {
	var averagePrice: Int
	var quantity: Int
	
	// 구조체의 연산 프로퍼티
	var purchasePrice: Int {
		get {
			return averagePrice * quantity
		}
		set(newPrice) {
			averagePrice = newPrice / quantity
		}
	}
}

var stock = Stock(averagePrice: 2300, quantity: 3)

// 연산 프로퍼티 Getter를 활용한 경우
stock.purchasePrice
// 6900

// 연산 프로퍼티 Setter를 활용한 경우
stock.purchasePrice = 3000
stock.averagePrice
// 1000

職業オブザーバー


主に,Propertyの変更を注視して対応する結果を返す,deinitOptiverとwillSetOptiverが代表的である.
class Account {
	var credit: Int = 0 {
		// 소괄호 이름 지정
		willSet {
			print("잔액이 \(credit)원에서 \(newValue)원으로 변경예정")
		}
		didSet {
			print("잔액이 \(oldValue)원에서 \(credit)원으로 변경완료")
		}
	}
}

var account = Account()
account.credit = 1000
// "잔액이 0원에서 1000원으로 변경예정"
// "잔액이 0원에서 1000원으로 변경완료"

を選択します。


インスタンスを作成する必要がなく、オブジェクト内のPropertyにアクセスできます.初期段階でdidSetキーワードを使用してPropertyを宣言すればいいです.
struct SomeStructure {
	// 스토어
	static var storedTypeProperty = "Some value"
	// 컴퓨티드
	static var computedTypeProperty: Int {
		return 1
	}
}

SomeStructure.computedTypeProperty
// 1
SomeStructure.storedTypeProperty
// "Some value"

SomeStructure.storedTypeProperty = "hello"
SomeStructure.storedTypeProperty
// "hello"

クラスと構造体の違い


共通点

  • 保存する値を宣言できる構成
  • 関数機能を有するメソッドを宣言可能
  • 使用可能static内部値へのアクセス
  • ジェネレータを使用して初期状態を設定できます
  • .拡張機能
  • extension有効化機能
  • 差異

  • クラスは参照タイプ、構造は値タイプ
  • クラスは参照タイプであり、hip領域に格納されるため、ARCを使用してメモリを管理する.逆に、構造体は値タイプであり、スタック領域に格納されるため、ARCを使用してメモリを管理しません.
  • クラスは参照タイプであり、同じクラスのインスタンスを複数の変数に割り当てて値を変更すると、すべての変数に影響します.逆に、構造体は値タイプであるため、同じ構造体を複数の変数に割り当てた後、値を変更しても他の変数には影響しません.新しい変数に構造体を割り当てるたびに、新しい構造体が生成されます.
  • クラスは継承可能、構造は継承不可
  • クラスは、タイプ鋳造によって実行時にクラスインスタンスのタイプを決定することができる.
  • クラスはProtocolを使用してクラスインスタンスのメモリ割当てを無効にできます
  • class SomeClass {
    	var count: Int = 0
    }
    
    struct SomeStruct {
    	var count: Int = 0
    }
    
    var class1 = SomeClass()
    var class2 = class1
    var class3 = class1
    class3.count = 2
    class1.count
    // 2
    
    var struct1 = SomeStruct()
    var struct2 = struct1
    var struct3 = struct1
    struct2.count = 3
    struct3.count = 4
    struct1.count
    // 0