iOS/Swift

인스턴스 생성 및 소멸 2편

밤새는 탐험가89 2024. 1. 30. 12:09

 

 

 

기본 이니셜라이저와 멤버와이즈 이니셜라이저 

 

기본 이니셜라이저저장 프로퍼티의 기본값이 모두 지정되고, 

동시에 사용자 정의 이니셜라이저가 정의되지 않을 떄 사용 

 

struct Market {
    var name: String = "E-Mart"
}

 

 

 

저장 프로퍼티를 선언할 때 기본값을 지정하지 않으면 이니셜라이저에서 초기값을 설정해야하는데 

구조체에서는 프로퍼티 이름으로 매개변수를 갖는 멤버와이즈 이니셜라이저를 기본으로 제공 

(단, 클래스는 멤버와이즈 이니셜라이저 미제공)

 

 

구조체 Fruit의 멤버와이즈 이니셜라이저 

struct Fruit {
    var name: String
    var price: Int 
}

Fruit.init()  // error: missing arguments for parameters 'name', 'price' in call

 

 

Fruit 구조체를 보면 내부에 저장 프로퍼티가 기본값을 갖고 있지 않음

이럴 경우 초기화되지 않은 저장 프로퍼티를 초기화 할 수 있도록

"init" 함수를 제공 (= 멤버와이즈 이니셜라이저)

 

 

이 때 init() 메소드 내의 파라미터의 순서는 

구조체 내 선언된 저장 프로퍼티 순서와 맞춰야 함 

 

 

Fruit.init(name: "no Name", price: 0)

 

 

만약에 저장 프로퍼티가 let 으로 선언되어 있고, 

초기화가 되어 있는 상태면 생성자 목록에서 제외 

("let"으로 선언되고, 초기값을 가질 경우는 값을 수정할 수 없기 때문)

 

 

struct Fruit {
    let name: String = "No name"
    var price: Int 
}

Fruit.init()  // error: missing argument for parameter 'price' in call

 

 

만약에 사용자 정의 이니셜라이저를 통해 "직접" 생성한 경우에는

더 이상 멤버와이즈 이니셜라이저는 제공되지 않음

(만약에 init도 쓰고 싶다면 "extension" 키워드를 통해

Fruit 구조체를 확장할 경우 가능)

 

 

struct Fruit {
    var name: String
    var price: Int

    init(name: String, price: Int) {
        self.name = name
        self.price = price
    }
}

Fruit.init() // 미제공

 

 

구조체 내 저장 프로퍼티 중에 1개라도 "private" 으로 선언될 경우 

멤버와이즈 이니셜라이저는 선언되지 않음