Swift5.1 구조체 멤버별 이니셜라이저(Memberwise Initializer)의 기본값 합성 SE-0242

안녕하세요~! 오늘은 Swift5.1에서 새롭게 변경된 사항들을 정리해보려고 하는데요 

첫 번째로 멤버셜 초기화(memberwise initializer)시 기본값 합성에 대해서 알아보려고 합니다.

어떻게 달라졌는데 함께 알아보시죠~!

 

기본적인 구조체 강아지를 만들었습니다.

struct Dog {
  var age: Int
  var name: String
}

 

컴파일러에서는 아래와 같이 초기화를 합성합니다.

init(age: Int, name: String)

 

그런데 만약 모든 강아지의 나이에 0으로 초기값을 갖는다고 가정 하고 인스턴스를 생성 했습니다.
하지만 인스턴스 생성시 Swift 컴파일러가 초기 값이 있는 속성에 대한 기본값을 생성할 수 없기 때문에 에러가 발생합니다.

struct Dog {
  var age: Int = 0
  var name: String
}

// error!!
let sparky = Dog(name: "Sparky")

 

어쩔수 없이 아래처럼 init을 선언해서 구현해야만 했습니다.

struct Dog {
  var age: Int = 0
  var name: String
  
  init(age: Int = 0, name: String) {
    self.age = age
    self.name = name
  }
}

 

Swift5.1에서는 안에 구현체를 구현하지 않고 선언만으로도 구현될 수 있도록 하였습니다.

struct Dog {
  var age: Int = 0
  var name: String

  // 컴파일러가 알아서 멤버 init생성
  init(age: Int = 0, name: String)
}

let sparky = Dog(name: "Sparky") // Dog(age: 0, name: "Sparky")

 

아래 구조체에서 상수값 d(let d: Bool = true)는 이미 초기화 되어있기에 멤버별 init에서 가져오지 않습니다.

struct Alphabet {
  var a: Int = 97
  let b: String
  var c: String = "c"
  let d: Bool = true
  var e: Double = Double.random(in: 0 ... .pi)

  // 컴파일러가 알아서 멤버 init생성
  init(
    a: Int = 97,
    b: String,
    c: String = "c",
    e: Double = Double.random(in: 0 ... .pi)
  )
}

 

오늘은 여기까지 입니다. 감사합니다~!!

 

참조:

https://github.com/apple/swift-evolution/blob/main/proposals/0242-default-values-memberwise.md