관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Designated init, convenience init 사용하는 시점 본문

iOS 응용 (swift)

[iOS - swift] Designated init, convenience init 사용하는 시점

jake-kim 2021. 7. 29. 00:56

Designated init

  • 코드에서는 designated를 생략하여 init으로만 작성
  • 클래스 내부에 초기화되지 않은채 존재하는 property들을 designated init에서 초기화 필수
class Person {
    var name: String
    var age: Int
    var etc: String? // optional형 > nil로 자동 초기화

    // designated init에서 초기화되지 않은 property 모두 초기화
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

Convenience init

  • 핵심은 '편의' init
  • 해당 코드에서 내부의 designated init 호출이 가능
  • designated init에서는  self.로 다른 designated init 호출 불가

ex) init은 기존에 있는 designated init과 똑같이 하지만 하나의 argument를 print하고 싶은 경우

// 가장 안좋은 방법 - 중복코드 생성

class Person {
    var name: String
    var age: Int

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

    init(name: String, age: Int, someStringForPrint: String) {
        self.name = name
        self.age = age
        print(someStringForPrint)
    }
}

중복코드를 피하기 위해 self.init(name:age:)를 사용하려고 할때, designated init안에서 또다른  designated init 호출 불가

designated init 호출 불가

  • convenience init을 사용하여 해결
class Person {
    var name: String
    var age: Int

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

    convenience init(name: String, age: Int, someStringForPrint: String) {
        self.init(name: name, age: age)
        print(someStringForPrint)
    }
}

 

Comments