-
Swift 초기화 메서드Programming/Swift(iOS) 2021. 4. 2. 21:58728x90
1. Struct 초기화
- struct는 초기화 메서드가 가지고 있는 프로퍼티에 대해서 자동으로 생성됩니다.
- 따라서 별도로 초기화 메서드를 만들 필요가 없지만,
- 만약 사용자 초기화 메서드를 작성하는 순간, 시스템에서 제공하는 자동 초기화 메서드는 더 이상 사용할 수 없습니다.
- 사용자 초기화 메서드와 시스템 초기화 메서드를 동시에 사용하도 싶다면, "extension"에 사용자 초기화 메서드를 구현하면 됩니다.
//CaseIterable protocol을 만족하므로써 enum이 제공하는 모든 case를 얻어 올 수 있는 //allCases 메서드 사용가능 enum Color:CaseIterable { case red, blue, white, crayon } struct Car { let name:String let color:Color } extension Car { init(name:String) { self.name = name //randomElement 자체가 Optional 반환, 아무것도 없을 때 nil을 반환한다. self.color = Color.allCases.randomElement()! } } let car:Car = Car(name:"Sonata", color:.red) let car2:Car = Car(name:"K5")
2. class 초기화
struct와 다르게 class는 초기화 메소드를 반드시 제공해야됩니다.
- 지정 초기화
일반적으로 사용하는 초기화 방법입니다.
init함수 호출시 class의 프로퍼티에 대해서 모두 초기화 해주는 것을 말합니다.
car1을 호출할때는 age에 대한 값을 넘겨주지 않았기 때문에 0으로 자동 초기화 됩니다.
class Car { let name:String var age:Int //age가 없으면 0으로 초기화 합니다. init(name:String, age:Int = 0) { self.name = name self.age = age } } let car1 = Car(name:"K5") let car2 = Car(name:"K7", age:10)
- require init
: 상속을 받게 되는 클래스에서 반드시 따르도록 강제하는 초기화 메서드입니다.
자식 클래스에 초기화 메서드가 없으면 상관없지만, 자식클래스에서 따로 초기화 메서드를 구현하는 경우에는 반드시 부모의 require init을 구현해야 합니다.
class Car { let name:String required init(name:String) { self.name = name } } class Truck:Car { let weight:Float init(weight:Float) { self.weight = weight super.init(name:"Truck") } /* error : Insert ' required init(name: String) { fatalError("init(name:) has not been implemented") }' */ }
- convenience 초기화
기본 init을 도와주는 초기화입니다.
사용자는 age만 입력하면, name은 자동으로 넣어주기를 원합니다.
이럴때 conveience init를 사용해서 age를 먼저 초기화 하고, "super.init(name)"을 호출하여 name을 초기화 하면됩니다.
class Car { var name:String = "" var age:Int init(name:String, age:Int) { self.name = name self.age = age } convenience init(age:Int) { self.init(name:"K3", age:age) } } let car1 = Car(age:15)
- 실패 가능한 초기화
초기화에 전달되는 인자값에 따라서 초기화 하지 못하게 조건을 거는 것입니다.
return 값으로 nil을 주기때문에 실패 가능하다고 불리는 것입니다.
class Car { let name:String init?(name:String) { if name == "" { return nil } self.name = name } }
'Programming > Swift(iOS)' 카테고리의 다른 글
Swift 오류 처리 - 1 (0) 2021.04.06 Swift 상속 (0) 2021.04.03 Swift Optional - 2 (0) 2021.04.02 Swift Optional - 1 (0) 2021.04.02 Swift Property - 3 (0) 2021.04.01