k-coding
Swift init() 인스턴스 초기화 본문
Swift init() 인스턴스 초기화
인스턴스의 저장 프로퍼티는 사용하기전에 항상 초기화가 되어야 합니다.
스위프트에서는 init()이라는 생성자를 사용하여, 인스턴스의 프로퍼티들마다
초기값을 설정하고, 새로운 인스턴스를 사용하기 전에 필요한 기본설정과 초기화를 할 수있다.
initoalizers 즉 init 생성자는 다음과 같이 호출 한다.
init() {
// 초기화 코드
}
예시를 들면 이렇게 된다.
class Weather{
var today: String = "화창"
func display(){
print("오늘의 날씨는 \(today)")
}
init(todayWeather: String){
today = todayWeather
} // designated initializer : 모든 프로퍼티는 다 초기화 시킴
}
var broadcast : Weather = Weather() // 오류
//init()을 생성하면 default initializer는 사라진다.
var broadcast : Weather = Weather(todayWeather: "흐림")
broadcast.display()
혹은 이렇게 초기값을 비워두고 init()안에서 설정해도 무관하다.
class Weather{
var today: String
func display(){
print("오늘의 날씨는 \(today)")
}
init(){
today = "화창"
}
}
var broadcast: Weather = Weather()
broadcast.display()
생성자 중첩
init()은 메소드와 달리 식별할 수 있는 이름을 가지지 않기 때문에
매개변수 명 / 타입이 각 생성자를 구별하는 역할을 한다.
이로 매개변수가 다른 두 생성자를 통해 여러가지 방법으로 인스턴스를 만들수 있다.
class Info {
// 외부이름과 내부이름을 준 경우
init(tall height: Double) {
}
// 인자명을 지정하지 않으면 내부 이름과 동일한 외부 이름을 가진다.
init(weight: Double) {
}
// 인자명을 생략하고 싶다면 '_'를 사용하면 된다.
init(_ footSize: Int) {
}
}
let info1 = Info(tall: 176.0) //initializer의 값만큼 불러와줘야한다.
let info2 = Info(weight: 70.2)
let info3 = Info(280)
self
초기화 선언중에 현재 클래스 내 메소드나 프로퍼티를 가리킬 때
메소드나 프로퍼티 앞에 self 키워드를 붙인다.
class Info {
let tall, weight,footSize: Float
init(tall:Float, weight:Float, footSize:Float){
self.tall = tall // 프로퍼티 = 매개변수
self.weight = weight
self.footSize = footSize
}
init(zeroSet: Float){
tall = zeroSet
weight = zeroSet
footSize = zeroSet
}
}
let info1 = Info(tall: 179, weight:71, footSize:280)
let info2 = Info(zeroSet: 0)
Optional Property Types
프로퍼티의 최초 값이 없고, 추후에 추가 되는 값을 옵셔널로 선언할 수 있다.
이러한 경우 프로퍼티는 자동적으로 nil로 초기화 된다.
class Info {
let tall, weight,footSize: Float
var age: Float? // 옵셔널
init(tall:Float, weight:Float, footSize:Float){
self.tall = tall
self.weight = weight
self.footSize = footSize
}
init(zeroSet: Float){
tall = zeroSet
weight = zeroSet
footSize = zeroSet
}
}
let info1 = Info(tall: 179, weight:71, footSize:280)
let info2 = Info(zeroSet: 0)
info1.age = 25
print(info1.age!)
Failable Intializers ( 실패 가능 생성자 ) : init?
클래스, 구조체, 열거형에서 초기화를 실패하는 경우가 있다면
옵셔널 타입처럼 init뒤에 ? 를 붙이면 된다.
Failable Intializers는 자신이 초기화하는 타입의 옵셔널 값을 생성한다.
초기화 과정 중 실패할지도 모르는 부분에서 return값을 nil로 잡아준다.
class Info {
let tall, weight,footSize: Float
var age: Float? // 옵셔널
init?(tall:Float, weight:Float, footSize:Float){ // failable initialize
self.tall = tall
self.weight = weight
if footSize = 0 {
return nil
} else{
self.footSize = footSize
}
}
init(zeroSet: Float){
tall = zeroSet
weight = zeroSet
footSize = zeroSet
}
}
// 옵셔널 형으로 선언후, 옵셔널 바인딩
var info: Info? = Info(tall: 179, weight:71, footSize:280)
if let info1 = info {
...
}
// 2 인스턴스 생성과 동시에 옵셔널 바인딩
if let info2 = Info(tall: 179, weight:71, footSize:280) {
...
}
// 3 인스턴스 생성하면서 강제 언래핑
var info3 : Info = Info(tall: 179, weight:71, footSize:280)!
// 4 옵셔널 인스턴스를 사용시 강제 언래핑
var info4 : Info? = Info(tall: 179, weight:71, footSize:280)
info4!.//메소드
'iOS > Swift 정리' 카테고리의 다른 글
Swift 상속 (0) | 2021.10.07 |
---|---|
Swift 프로퍼티 (0) | 2021.10.06 |
Swift 타입 메소드 ( static 메소드 / class 메소드 ) (0) | 2021.10.06 |
Swift 클로저( closure ) (0) | 2021.09.30 |
Swift 1급 객체 / 시민 (0) | 2021.09.29 |
Comments