아리의 iOS 탐구생활

[Swift] 이니셜라이저(initalizer) / 값타입에서의 사용 [2] 본문

Swift/문법

[Swift] 이니셜라이저(initalizer) / 값타입에서의 사용 [2]

Ari Lee 2021. 8. 14. 03:00
반응형

✔️ Struct’s initalizer

 

종류


 

🔍  Memberwise initalizer

구조체 내에 프로퍼티가 하나라도 초기화 되지 않은 경우, 초기값이 없는 속성을 매개변수로 갖는 Memberwise  initalizer가 제공된다. 

속성이 모두 let으로 값까지 모두 초기화 되어있는 경우에는 Memberwise  initalizer는 제공되지 않는다.

 

🔍  기본 initalizer

프로퍼티가 모두 초기화 되어있는 경우 매개변수가 없는 initalizer가 제공된다.

 

struct Sample {
    let own: Int
    let two: String
    let three: Bool
}

let test1 = Sample(own: 1, two: "문자열", three: true) // Memberwise initalizer

struct SampleOwn {
    var say: String = "own"
}

let testOwn = SampleOwn() // 기본 initalizer
let testTwo = SampleOwn(say: "two") // Memberwise initalizer

struct SampleTwo {
    let say: String = "own"
}

let testThree = SampleTwo() // 기본 initalizer

 

 

 

 

🔍  Initializer Delegation for Value Types

이니셜라이저는 다른 이니셜라이저를 호출하여 인스턴스 초기화의 일부를 수행할 수 있다. 이를 initalizer 위임이라고 한다.

struct Frame {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
    
    init(y: Int) {
        self.init(x: 0, y: y) // 다른 initalizer를 호출
    }
}

let test = Frame(x: 10, y: 5)
print(test) // Frame(x: 10, y: 5)
let testCopy = Frame(y: 10)
print(testCopy) // Frame(x: 0, y: 10)

 

 

 

 

🔍  initalizer Extension for Value Types

Extension 본연의 의미 그대로 처음에 구현하지 않고 추후에 initalizer를 추가로 구현할 수도 있다.

self.init initalizer 작성할 때만 호출할 수가 있는데, 구조체나 열거형에서 사용자 정의 initalizer 구현하면 default initalizer memberwise initalizer 이상 접근할 없다. 이러한 제한은 initalizer 만들어뒀지만 누군가가 사용할 이를 사용하지 않고 기본적으로 제공되는 initalizer 사용하여 발생하게 되는 오류를 방지할 있다. 이러한 제한이 싫고 default initalizer 사용하고 사용자 정의 initalizer 사용하고 싶다면 Extension으로 확장해주면 되겠다.

struct Frame {
    var x: Int = 1
    var y: Int = 1
}

extension Frame {
    
    init(value: Int) {
        self.init(x: value, y: value) // 다른 initalizer를 호출
    }
}

let own = Frame(x: 10, y: 5) // Memberwise initalizer
let two = Frame(value: 10) // 사용자 정의
let three = Frame() // Default initalizer

 

 

 

 

✔️ Enum’s initalizer

열거형은 rawValue가 있는 경우 rawValue로부터 인스턴스를 생성할 수 있는 실패가능한 initalizer가 기본으로 제공된다.

열거형의 case들을 초기화해주는 것은 가능하지만 rawValue는 상수이기 때문에 초기화 해줄 수 없다.

 

enum Color: String {
    case red
    case blue
    case yellow = "노랑"
    
    init(color: Character) {
        switch color {
            case "r", "R":
                self = .red
            case "b", "B":
                self = .blue
            default:
                self = .yellow
        }
    }
}

let own = Color(color: "R") // red
let two = Color(rawValue: "레드") // nil
let three = Color(rawValue: "노랑") // yellow

 

 

 

 

✔️ Apple 공식문서 참고

 

Initialization — The Swift Programming Language (Swift 5.5)

Initialization Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization t

docs.swift.org

 

반응형
Comments