iOS/스탠포드 iOS 강의

[스탠포드iOS] Swift 기초문법 정리(Initialization)

홍복치 2024. 3. 17. 20:02

Initialization

인자없는 init을 자동으로 생성

init을 만든다면 인자없는 자동생성 init을 사용하지 않는다

struct MyStruct {
    var x: Int
    var y: String
}

let foo = init(x: 5, y: "hello")

 

init 안에서 할 수 있는 것

프로퍼티 값 설정(심지어 이미 기본값을 가지고 있어도 설정 가능)

상수도 설정 가능

여러 init메소드에서 다른 init메소드를 한개만 호출 가능

부모 클래스의 init도 호출 가능

 

init 안에서 반드시 해주어야 할 것

init이 끝날 때는 모든 프로퍼티가 값을 가져야 함

 

클래스에서는 init메소드로 두개의 타입이 존재

 - 지정초기화를 직접 구현하지 않아도 되는 경우: 생성자를 작성하지 않아도 모든 프로퍼티가 기본값을 가질 때

 

편의 초기화 함수

- convenience initializers(convenience init)

- 모든 프로퍼티 초기화 하지 않아도 됨. 편의 초기화함수는 그 클래스 안에서 지정init이나 편의init을 호출하고 초기화 필요

- 부모 클래스의 초기화 함수 부를 수 없음

- 편의 초기화 함수는 어떤 프로퍼티의 값 설정 전 반드시 그 init을 호출해야 함

 

지정 초기화 함수

- designated initializers(init)

- 부모클래스에 있는 지정 초기화 호출 필요(부모클래스의 편의 초기화 함수 호출불가)

- 부모 클래스 init을 부르기 전 클래스에서 만든 모든 프로퍼티 초기화 필요(super.init 부르기 전 모든 프로퍼티 초기화 필요)

- 부모 클래스 프로퍼티 접근 전 부모클래스의 init 호출 필요

- 일을 하고 부모를 부른 후에야 부모클래스 프로퍼티에 접근이 가능

 

상속

- 지정init을 어떤것도 실행하지 않는다면 부모클래스의 모든 지정init 상속 

- 부모클래스의 모든 지정init을 override하거나 그것들 중 어느것도 실행하지 않으면 부모클래스로부터 모든 편의 초기화 함수 상속 가능

- 부모클래스의 편의 초기화 함수는 부모클래스의 지정 초기화 함수에 종속적(서로 연결동작)

- 초기화 하지 않으면 부모클래스의 초기화 함수 모두 가지게 됨(편의든 지정이든)

 

Required init

자식클래스는 이 init을 반드시 실행해야 한다는 뜻

 

Failable init

실패할 수 있는 init

초기화 실패 시 옵셔널 값이 반환될 수 있도록 함

드물게 사용

"foo"라는 이름으로 이미지를 찾지 못하면 nil 반환

init?(arg1: Type1, ...){
	//might return nil in here
}

let image = UIImage(named: "foo") //image는 UIImage?
if let image = UIImage(named: "foo"){ ... }

 

 

어려워서 블로그 참고해서 이해하는데 도움을 받았다. 정리가 너무 잘되어있는..👍

https://babbab2.tistory.com/168

https://babbab2.tistory.com/170