Swift 5 : 초기화 (Initialization)

버들비·2020년 7월 16일
0

Swift

목록 보기
9/10

클래스, 구조체, 열거형 인스턴스를 사용하기 위한 준비작업. 이니셜라이저(initializer)를 정의하는 것으로 구현한다. swift의 이니셜라이저는 값을 반환하지 않는다.
이니셜라이저로 저장 프로퍼티에 값을 설정하면 프로퍼티 옵저버가 호출되지 않고 값 할당이 수행된다.
프로퍼티 선언과 동시에 값을 할당하는 것으로 초기값을 줄 수도 있다. 항상 같은 초기값을 갖는다면 프로퍼티 선언과 동시에 값을 할당하는 기본 프로퍼티(default property)를 이용하는게 좋다. 이 기본값은 상속시 함께 상속된다.
모든 프로퍼티에 기본값이 설정돼 있다면 이니셜라이저를 생략해도 된다. swift 가 알아서 해준다.

이니셜라이저를 이용한 초기화 코드는 다음과 같다.

struct Fahrenheit {
    var temperature: Double
    init() {
        temperature = 32.0
    }
}

기본 프로퍼티를 이용한 초기화는 다음과 같다.

struct Fahrenheit {
    var temperature = 32.0
}

초기화 파라미터(Initialization Parameter)

초기화 정의때 파라미터를 이용할 수 있다.

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0

파라미터 이름과 인자 레이블(Parameter Name and Argument Label)

이니셜라이저는 이름을 갖기 않고 파라미터로 식별한다.
다음 코드는 초기화 때 파라미터를 3개 입력받는 이니셜라이저와 하나만 입력받는 이니셜라이저다.

struct Color {
    let red, green, blue: Double
    init(red: Double, green: Double, blue: Double) {
        self.red   = red
        self.green = green
        self.blue  = blue
    }
    init(white: Double) {
        red   = white
        green = white
        blue  = white
    }
}

인스턴스 인자에 값을 3개 주거나 1개 주어서 Color 인스턴스를 만들 수 있다.

let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)

다음과 같이 초기화 과정에서 인자 레이블이 포함돼 있지 않으면 에러가 발생한다.

let veryGreen = Color(0.0, 1.0, 0.0)
// this reports a compile-time error - argument labels are required

이니셜라이저 또한 외부 매개변수명(인자레이블)을 _ 를 이용해 생략할 수 있다.

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    init(_ celsius: Double) {
        temperatureInCelsius = celsius
    }
}
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius is 37.0

옵셔널 프로퍼티

프로퍼티의 값의 나중에 추가될 수 있는 경우 옵셔널로 선언해 둘 수 있다. 옵셔널 프로퍼티는 자동으로 nil 값으로 초기화된다.

class SurveyQuestion {
    var text: String
    var response: String?
    init(text: String) {
        self.text = text
    }
    func ask() {
        print(text)
    }
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Prints "Do you like cheese?"
cheeseQuestion.response = "Yes, I do like cheese."

상수 프로퍼티에 초기화 할당

이니셜라이저는 상수 프로퍼티에 값을 할당하는 것도 가능하다. 프로퍼티를 let 으로 선언해서, 이 프로퍼티는 처음에 초기화되면 변경되지 않는 프로퍼티라고 표현할 수 있다.
클래스 인스턴스에서 상수 프로퍼티의 초기화는 그 클래스 안에서만 가능하고, 서브클래스에서는 변경이 불가능하다.

reference

https://jusung.gitbook.io/the-swift-language-guide/language-guide/14-initialization#parameter-names-and-argument-labels

0개의 댓글