티스토리 뷰
[인스턴스 생성]
- 초기화 과정 시 새로운 인스턴스를 사용할 준비를 하기 위하여 저장 프로퍼티의 초기값을 설정하는 등의 일을 함
: 이니셜라이저(이하 생성자)를 정의하여 초기화 과정을 직접 구현할 수 있음
- 생성자는 새로운 인스턴스를 생성하는 특별한 메서드
- init 키워드를 사용
- 클래스, 구조체, 열거형의 구현부 또는 해당 타입의 익스텐션 구현부에 위치함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class Class{ var name: String init() { name = "Swift" } init(name: String) { self.name = name } } struct Struct{ var name: String init() { name = "Swift" } } enum Enum{ case name init(){ self = .name //열거형은 초기화할 때 반드시 case 중 하나가 되어야 함 } } let a = Class() let b = Class(name: "ObjC") print(a.name) //Swift print(b.name) //ObjC | cs |
- 구조체와 클래스의 인스턴스는 처음 생성 시 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초기값을 할당해야 함
: 초기화 과정에서 값이 할당되지 않은 옵셔널 저장 프로퍼티에는 nil이 할당됨
- 프로퍼티 정의 시 기본값을 할당하면 생성자에서 따로 초기값을 할당하지 않아도 됨
- 구조체의 경우 생성자가 없으면 자동으로 멤버와이즈 생성자가 만들어짐
: 프로퍼티의 이름으로 매개변수를 가짐
: 사용자 정의 생성자를 구현하였다면 멤버와이즈 생성자는 만들어지지 않음
- 클래스는 그렇지 않으므로 생성자를 활용하고 싶으면 직접 구현해 주어야 함
[초기화 위임]
- 구조체, 열거형에서 생성자가 다른 생성자에게 일부 초기화를 위임하는 초기화 위임을 구현할 수 있음
- 코드 중복을 피할 수 있음
- 최소 두 개 이상의 사용자 정의 생성자를 정의해야 함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | enum Student{ case elementary, middle, high case none init(){ self = .none } init(koreanAge: Int){ switch(koreanAge){ case 8...13: self = .elementary case 14...16: self = .middle case 17...19: self = .high default: self = .none } } init(bornAt: Int, currentYear: Int){ self.init(koreanAge: currentYear - bornAt + 1) } //초기화 위임 : 생성자에서 다른 생성자를 호출 } var school: Student = Student(koreanAge: 18) //high school = Student(bornAt: 1998, currentYear: 2017) //none | cs |
[실패 가능한 이니셜라이저]
- init? 키워드를 사용하여 초기화 실패 시 nil을 반환하도록 함
: 실제로 생성자가 값을 반환하는 것은 아님
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | enum Student{ case elementary, middle, high case none init?(koreanAge: Int){ switch(koreanAge){ case 8...13: self = .elementary case 14...16: self = .middle case 17...19: self = .high default: return nil } } init?(bornAt: Int, currentYear: Int){ self.init(koreanAge: currentYear - bornAt + 1) } //초기화 위임 : 생성자에서 다른 생성자를 호출 } if let school = Student(koreanAge: 43){ print(school) //실행 안됨 } if let school = Student(koreanAge: 17){ print(school) //high } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Class{ var integers: [Int] = { var array = [Int]() for i in 0...15{ array.append(i) } return array }() //클로저 실행을 위해 소괄호 쌍을 뒤에 붙임 //소괄호가 없으면 클로저 그 자체를 integers에 할당하는 것 -> integers는 Int형 배열을 반환하는 함수가 됨 } let a = Class() a.integers //0, 1, ..., 14, 15 | cs |
위의 코드는 클로저를 활용하여 프로퍼티의 기본값을 할당하는 것
[인스턴스 소멸]
- 클래스의 인스턴스는 디이니셜라이저(이하 소멸자)를 구현 가능함
- deinit 키워드 사용
- 단 하나의 소멸자만 구현할 수 있음
- iOS에서 뷰의 생성/소멸을 확인하기 위해 사용할 수 있는 것 같음
'Swift > 야곰의 스위프트' 카테고리의 다른 글
13장 클로저 (0) | 2018.02.12 |
---|---|
12장 접근제어 (0) | 2018.02.05 |
10장 프로퍼티와 메서드 (0) | 2018.02.03 |
9장 구조체와 클래스 (0) | 2018.02.03 |
8장 옵셔널 (0) | 2018.02.03 |