Initializer in Swift - 4

권승용(Eric)·2024년 11월 4일

TIL

목록 보기
6/38

필수 초기자들

  • 클래스의 모든 서브클래스가 해당 초기자를 구현해야 함을 나타내기 위해 require 모디파이어를 작성할 수 있다.
class SomeClass {
    required init() {
        // initializer implementation goes here
    }
}
  • 또한 필수 초기자의 모든 서브클래스 구현에도 require 모디파이어를 작성해 그 아래 서브클래스에도 필수 초기자임을 알려주어야 한다. 필수 지정 초기자를 오버라이딩 할 때에는 override 모디파이어를 작성하지 않는다.
class SomeSubclass: SomeClass {
    required init() {
        // subclass implementation of the required initializer goes here
    }
}

만약 상속된 초기자로 요구사항을 만족시킬 수 있다면 필수 초기자의 명시적 구현을 제공하지 않아도 된다.

클로저 또는 함수로 기본 프로퍼티 값 지정하기

  • 저장 프로퍼티의 기본값에 몇 가지 설정이 필요하다면 클로저 또는 전역 함수를 사용해 커스텀 기본값을 해당 프로퍼티에 제공할 수 있다.
  • 프로퍼티가 속한 타입의 새 인스턴스가 초기화될 때마다 클로저 또는 함수가 호출되고 그 반환 값이 프로퍼티의 기본값으로 할당된다.
  • 이러한 종류의 클로저 또는 함수는 일반적으로 프로퍼티와 동일한 타입의 임시 값을 생성하고 원하는 초기 상태를 나타내도록 해당 값을 조정한 다음 해당 임시 값을 프로퍼티의 기본값으로 사용할 수 있도록 반환한다.
class SomeClass {
    let someProperty: SomeType = {
        // create a default value for someProperty inside this closure
        // someValue must be of the same type as SomeType
        return someValue
    }()
}
  • 클로저의 끝 중괄호 뒤에는 빈 괄호 한 쌍이 있다는 점에 유의. 이는 Swift가 클로저를 즉시 실행하도록 지시한다.
  • 이 괄호를 생략하면 클로저의 반환 값이 아닌 클로저 자체를 프로퍼티에 할당하려는 것이다.

프로퍼티 초기화에 클로저를 사용할 땐 클로저가 실행되는 순간에는 인스턴스의 나머지 프로퍼티들은 초기화되지 않은 상황임을 기억해야 한다. 이는 다른 프로퍼티들이 기본값을 가지고 있어도, 클로저 내에서는 다른 프로퍼티 값에 접근할 수 없다는 뜻이다. 또한 암시적 self 프로퍼티를 사용하거나 인스턴스 메소드를 호출할 수 없다.

struct Chessboard {
    let boardColors: [Bool] = {
        var temporaryBoard: [Bool] = []
        var isBlack = false
        for i in 1...8 {
            for j in 1...8 {
                temporaryBoard.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        return temporaryBoard
    }()
    func squareIsBlackAt(row: Int, column: Int) -> Bool {
        return boardColors[(row * 8) + column]
    }
}

let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1))
// Prints "true"
print(board.squareIsBlackAt(row: 7, column: 7))
// Prints "false"
  • 새로운 Chessboard 인스턴스가 생성댈 때 마다 클로저가 실행되고, boardColors의 기본값이 계산 후 반환된다.
profile
ios 개발자에용

0개의 댓글