SlideShare a Scribd company logo
swift 0x0e
initialization
문현진(arnold@css99.co.kr)
초기자
init
초기자
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
기본 속성 값
struct Fahrenheit {
var temperature = 32.0
}
사용자 정의 초기화 - 초기화 파라메터
struct Celsius {
var temperatureInCelsius: Double = 0.0
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (faherenheit - 32.0)/1.8
}
}
사용자 정의 초기화 - 지역 파라메터
struct Color {
let red = 0.0, green = 0.0, blue = 0.0
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
사용자 정의 초기화 - 외부 파라메터
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let veryGreen = Color(0.0, 1.0, 0.0)
init 의 파라메터는 기본적으로
지역 파라메터 + 외부 파라메터 이다.
옵셔널 속성 타입
class SurveyQuestion {
var text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
println(text)
}
}
옵셔널 속성 타입
let cheeseQuestion =
SurveyQuestion(text: “Do you like
cheese?”)
cheeseQuestion.ask()
cheeseQuestion.response = “Yes, I do
like cheese.”
class SurveyQuestion {
let text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
println(text)
}
}
초기화 과정중에 상수 속성을 변경하기
let cheeseQuestion =
SurveyQuestion(text: “How about
beets??”)
cheeseQuestion.ask()
cheeseQuestion.response = “I also
like beets.”
기본 초기자
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
모든 속성은 기본 값을 가져야 합니다.
옵셔널은 자동 기본값으로 nil을 받습
니다.
구조체 타입의 멤버 단위 초기화
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0,
height: 2.0)
모든 속성에 기본값이 있고,
사용자 정의 초기자가 없으면
=> 구조체 타입은 자동으로 멤버 단위
초기자를 가진다.
값 타입 = 구조체, 열거자
값 타입의 초기자 대리자
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
값 타입의 초기자 대리자
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size:Size) {
self.origin = origin
self.size = size
}
init(center: Point, size:Size) {
let originX = center.x - (size.width /2)
let originY = center.y - (size.height /2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
정사각형을 그리는 방법은 3가지가 있다.
1. (0, 0)에 위치하는 크기 0 짜리 정사각형
2. (x, y)에 위치하는 크기 n 짜리 정사각형
3. (x, y)를 중심으로하는 크기 n짜리 정사각
형
이 초기화 시나리오이다. 3번 째 초기자에
서, 2번째 초기자를 호출 또는 대리 한다.
클래스 상속과 초기화
클래스의 모든 속성은 반드시 초기 값이 있어야 한다
클래스 상속과 초기화
지정 초기자
주 초기자
모든 속성을 완전히 초기화
+
적절한 부모 클래스 초기자 호출
모든 클래스는 반드시 하나 이상의 지정 초기자를
가져야 한다.
편의 초기자
부 초기자
같은 클래스내의 지정 초기자를 호출하는 초기자
호출하는 지정 초기자의 몇몇 파라메터를 기본으
로 하는 초기자
특정 용도나 입력 값 타입에 대한 클래스 인스턴스
를 만드는 초기자
클래스 상속과 초기화
1 Phase
해당 클래스가 가지는 저장속성에 초기값을 할당 한다.
2 Phase
클래스 인스턴스를 사용할 준비가 되기 전까지 속성 값을 변경한다.
두 단계 초기화
안전 점검 1
부모 클래스의 초기자를 위임하기 전에, 내 클래
스의 속성이 초기화 되었는지 확인한다.
안전 점검 2
지정 초기자는 상속받은 속성에 값을 할당하기 전
에 부모 클래스의 초기자를 수행해야 합니다. (값
이 부모 클래스의 초기화 중에 덮어씌워진다.)
안전 점검 3
편의 초기자는 속성에 값을 할당하기전에 다른 초
기자를 대리 수행 해야 합니다. 그렇지 않으면 편
의 초기자가 할당한 값은 지정 초기자에 의해 덮어
씌워집니다.
안전 점검 4
초기자는 인스턴스 메소드를 호출 할 수 없습니다.
초기화 첫 단계가 끝나기 전에는 self도 참조 할 수
없습니다.
두 단계 초기화
Phase 1
두 단계 초기화
Phase 2
두 단계 초기화
swift의 자식 클래스는 기본적으로 부모 클래스의 초기자를 상속 받지 않습니다
.
(=! object-C)
초기자 상속과 오버라이딩
초기화 중간에 뭔가 수정 하기 위해서, 부모 클래스와 같은 초기자를 가진 자식
클래스가 필요 할 때, 자식 클래스에 같은 초기자를 오버라이딩 해서 구현 할 수
있습니다.
오버라이딩 하는 초기자가 지정 초기자라면, 오자식 클래스에서 구현체를 오버
라이드 하고, 오버라이딩 하는 버전에서 부모 버전의 초기자를 호출 하도록 할
수 있습니다.
초기자 상속과 오버라이딩
Rule 1
자식 클래스가 지정 초기자를 정의하지 않는다.
Rule 2
자식 클래스가 부모 클래스의 모든 지정 초기자를 구현한다.
초기자 자동 상속
편의 초기자는 convenience를 사용합
니다.
convenience init(parameters) {
statements
}
클래스의 지정 초기자는 값 타입을 위
한 단순 초기자와 같은 방식으로 작성
한다.
init(parameters) {
statements
}
지정 초기자, 편의 초기자의 문법
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: “[Unnamed]”)
}
}
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
class RecipeIngredient: Food {
var quantity: Int
init(name:String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
지정 초기자와 편의 초기자 실습
let oneMysteryItem =
RecipeIngreidnet()
let oneBacon =
RecipeIngredient(name:
“Bacon”)
let sixEggs =
RecipeIngredient(name: “Eggs”,
quantity: 6)
지정 초기자와 편의 초기자 실습
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = “(quantity) x
(name.lowercaseString)”
output += purchased ? “V” : “X”
return output
}
}
지정 초기자와 편의 초기자 실습
class SomeClass {
let someProperty: SomeType = {
return someValue}()
}
클로저나 함수로 기본 속성 값을 설정하
기
클로저나 함수로 기본 속성 값을 설정하
기
클로저나 함수로 기본 속성 값을 설정하
기

More Related Content

PPTX
Java mentoring of samsung scsc 0
PPT
자바스터디(6기) 3
PPTX
파이썬+Operator+이해하기 20160409
PPTX
포트폴리오에서 사용한 모던 C++
PDF
배열과 포인터
PDF
C++ Concurrency in Action 9-2 Interrupting threads
PPTX
Processing 기초 이해하기_20160713
PPTX
파이썬+함수 데코레이터+이해하기 20160229
Java mentoring of samsung scsc 0
자바스터디(6기) 3
파이썬+Operator+이해하기 20160409
포트폴리오에서 사용한 모던 C++
배열과 포인터
C++ Concurrency in Action 9-2 Interrupting threads
Processing 기초 이해하기_20160713
파이썬+함수 데코레이터+이해하기 20160229

What's hot (20)

PPTX
Gpg gems1 1.3
PPTX
Python array.array 모듈 이해하기
PPTX
[devil's camp] - 알고리즘 대회와 STL (박인서)
PPTX
파이썬+함수이해하기 20160229
PPTX
텐서플로우 기초 이해하기
PDF
2015 Kitel C 언어 강좌3
PPTX
Swift 0x02 기본 연산자
PDF
Effective modern cpp item18, 19
PPTX
파이썬+Json+이해하기 20160301
PPTX
파이썬+객체지향+이해하기 20160131
PPTX
망고100 보드로 놀아보자 3
PPTX
Matplotlib 기초 이해하기_20160730
PDF
Haskell study 10
PDF
Haskell study 9
PPTX
파이썬 sqlite 이해하기
PPTX
자바스크립트 패턴 3장
PDF
Do swift: Swift 무작정 해보기
PPT
프리젠테이션-제목없음
PPTX
Python 이해하기 20160815
PPTX
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Gpg gems1 1.3
Python array.array 모듈 이해하기
[devil's camp] - 알고리즘 대회와 STL (박인서)
파이썬+함수이해하기 20160229
텐서플로우 기초 이해하기
2015 Kitel C 언어 강좌3
Swift 0x02 기본 연산자
Effective modern cpp item18, 19
파이썬+Json+이해하기 20160301
파이썬+객체지향+이해하기 20160131
망고100 보드로 놀아보자 3
Matplotlib 기초 이해하기_20160730
Haskell study 10
Haskell study 9
파이썬 sqlite 이해하기
자바스크립트 패턴 3장
Do swift: Swift 무작정 해보기
프리젠테이션-제목없음
Python 이해하기 20160815
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Ad

Viewers also liked (20)

PDF
Sab ki khabren
PDF
Yves Rocher C-11/2014
PDF
Model de prova pau
PPTX
Fiestas religiosas
PDF
Ünilig İnfograf
PPTX
Simplified Approach in Teaching Photography to Elementary Students
DOC
PPTX
Línea del tiempo deportivo sierra hermosa
PPTX
аварийная сантехническая служба
PDF
Breakfast club - Clickmate CRM
PPTX
Aula 11 11 - argos campos simões
PPTX
Definitivo
PDF
GIẢI PHÁP NÂNG CAO NĂNG LỰC CẠNH TRANH CỦA GÂN HÀNG TMCP QUỐC TẾ VIỆT NAM TRO...
PDF
Acro
PPTX
Aula 30 10-13 - fernando salaberry
PPT
Happy birthday Nikki!
PPTX
La comunicación
PDF
Dossier italiafiere italiano
DOC
Formato informes
PDF
Презентация объектов СВАО
Sab ki khabren
Yves Rocher C-11/2014
Model de prova pau
Fiestas religiosas
Ünilig İnfograf
Simplified Approach in Teaching Photography to Elementary Students
Línea del tiempo deportivo sierra hermosa
аварийная сантехническая служба
Breakfast club - Clickmate CRM
Aula 11 11 - argos campos simões
Definitivo
GIẢI PHÁP NÂNG CAO NĂNG LỰC CẠNH TRANH CỦA GÂN HÀNG TMCP QUỐC TẾ VIỆT NAM TRO...
Acro
Aula 30 10-13 - fernando salaberry
Happy birthday Nikki!
La comunicación
Dossier italiafiere italiano
Formato informes
Презентация объектов СВАО
Ad

Similar to Swift 0x0e 초기화 (20)

PPTX
Swift3 : class and struct(+property+method)
PDF
Swift3 subscript inheritance initialization
PPTX
파이썬+클래스+구조+이해하기 20160310
PDF
일단 시작하는 코틀린
PDF
5장 객체와클래스
PDF
2014-15 Intermediate C++ Study #6
PPTX
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
PPTX
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
PPTX
More effective c++ chapter1,2
PDF
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
PDF
안드로이드 설계코드 노하우 및 개발방법
PDF
3주차 스터디
PDF
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
PPTX
Programming java day2
PDF
C++ Advanced 강의 1주차
PPTX
Angular2 가기전 Type script소개
PDF
시작하자 단위테스트
PPT
강의자료3
PDF
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PPTX
Data Mining with R CH1 요약
Swift3 : class and struct(+property+method)
Swift3 subscript inheritance initialization
파이썬+클래스+구조+이해하기 20160310
일단 시작하는 코틀린
5장 객체와클래스
2014-15 Intermediate C++ Study #6
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
More effective c++ chapter1,2
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
안드로이드 설계코드 노하우 및 개발방법
3주차 스터디
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
Programming java day2
C++ Advanced 강의 1주차
Angular2 가기전 Type script소개
시작하자 단위테스트
강의자료3
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
Data Mining with R CH1 요약

More from Hyun Jin Moon (13)

PPTX
Swift 0x19 advanced operators
PPTX
Swift 0x18 access control
PPTX
Swift 0x17 generics
PPTX
Swift 0x14 nested types
PPTX
Swift 0x12 optional chaining
PPTX
Swift 0x0d 상속
PPTX
Swift 0x0c 서브스크립트
PPTX
Swift 0x01 환경 설정
PDF
Quick, Tree sort
PDF
Shell, merge, heap sort
PPTX
Djang Beginning 2
PPTX
Programming challange crypt_kicker
PPTX
Node.js Cloud Service Publish
Swift 0x19 advanced operators
Swift 0x18 access control
Swift 0x17 generics
Swift 0x14 nested types
Swift 0x12 optional chaining
Swift 0x0d 상속
Swift 0x0c 서브스크립트
Swift 0x01 환경 설정
Quick, Tree sort
Shell, merge, heap sort
Djang Beginning 2
Programming challange crypt_kicker
Node.js Cloud Service Publish

Swift 0x0e 초기화

  • 3. 초기자 struct Fahrenheit { var temperature: Double init() { temperature = 32.0 } }
  • 4. 기본 속성 값 struct Fahrenheit { var temperature = 32.0 }
  • 5. 사용자 정의 초기화 - 초기화 파라메터 struct Celsius { var temperatureInCelsius: Double = 0.0 init(fromFahrenheit fahrenheit: Double) { temperatureInCelsius = (faherenheit - 32.0)/1.8 } }
  • 6. 사용자 정의 초기화 - 지역 파라메터 struct Color { let red = 0.0, green = 0.0, blue = 0.0 init(red: Double, green: Double, blue: Double) { self.red = red self.green = green self.blue = blue } }
  • 7. 사용자 정의 초기화 - 외부 파라메터 let magenta = Color(red: 1.0, green: 0.0, blue: 1.0) let veryGreen = Color(0.0, 1.0, 0.0) init 의 파라메터는 기본적으로 지역 파라메터 + 외부 파라메터 이다.
  • 9. class SurveyQuestion { var text: String var response: String? init(text: String) { self.text = text } func ask() { println(text) } } 옵셔널 속성 타입 let cheeseQuestion = SurveyQuestion(text: “Do you like cheese?”) cheeseQuestion.ask() cheeseQuestion.response = “Yes, I do like cheese.”
  • 10. class SurveyQuestion { let text: String var response: String? init(text: String) { self.text = text } func ask() { println(text) } } 초기화 과정중에 상수 속성을 변경하기 let cheeseQuestion = SurveyQuestion(text: “How about beets??”) cheeseQuestion.ask() cheeseQuestion.response = “I also like beets.”
  • 11. 기본 초기자 class ShoppingListItem { var name: String? var quantity = 1 var purchased = false } var item = ShoppingListItem() 모든 속성은 기본 값을 가져야 합니다. 옵셔널은 자동 기본값으로 nil을 받습 니다.
  • 12. 구조체 타입의 멤버 단위 초기화 struct Size { var width = 0.0, height = 0.0 } let twoByTwo = Size(width: 2.0, height: 2.0) 모든 속성에 기본값이 있고, 사용자 정의 초기자가 없으면 => 구조체 타입은 자동으로 멤버 단위 초기자를 가진다.
  • 13. 값 타입 = 구조체, 열거자 값 타입의 초기자 대리자 struct Size { var width = 0.0, height = 0.0 } struct Point { var x = 0.0, y = 0.0 }
  • 14. 값 타입의 초기자 대리자 struct Rect { var origin = Point() var size = Size() init() {} init(origin: Point, size:Size) { self.origin = origin self.size = size } init(center: Point, size:Size) { let originX = center.x - (size.width /2) let originY = center.y - (size.height /2) self.init(origin: Point(x: originX, y: originY), size: size) } } 정사각형을 그리는 방법은 3가지가 있다. 1. (0, 0)에 위치하는 크기 0 짜리 정사각형 2. (x, y)에 위치하는 크기 n 짜리 정사각형 3. (x, y)를 중심으로하는 크기 n짜리 정사각 형 이 초기화 시나리오이다. 3번 째 초기자에 서, 2번째 초기자를 호출 또는 대리 한다.
  • 15. 클래스 상속과 초기화 클래스의 모든 속성은 반드시 초기 값이 있어야 한다
  • 16. 클래스 상속과 초기화 지정 초기자 주 초기자 모든 속성을 완전히 초기화 + 적절한 부모 클래스 초기자 호출 모든 클래스는 반드시 하나 이상의 지정 초기자를 가져야 한다. 편의 초기자 부 초기자 같은 클래스내의 지정 초기자를 호출하는 초기자 호출하는 지정 초기자의 몇몇 파라메터를 기본으 로 하는 초기자 특정 용도나 입력 값 타입에 대한 클래스 인스턴스 를 만드는 초기자
  • 18. 1 Phase 해당 클래스가 가지는 저장속성에 초기값을 할당 한다. 2 Phase 클래스 인스턴스를 사용할 준비가 되기 전까지 속성 값을 변경한다. 두 단계 초기화
  • 19. 안전 점검 1 부모 클래스의 초기자를 위임하기 전에, 내 클래 스의 속성이 초기화 되었는지 확인한다. 안전 점검 2 지정 초기자는 상속받은 속성에 값을 할당하기 전 에 부모 클래스의 초기자를 수행해야 합니다. (값 이 부모 클래스의 초기화 중에 덮어씌워진다.) 안전 점검 3 편의 초기자는 속성에 값을 할당하기전에 다른 초 기자를 대리 수행 해야 합니다. 그렇지 않으면 편 의 초기자가 할당한 값은 지정 초기자에 의해 덮어 씌워집니다. 안전 점검 4 초기자는 인스턴스 메소드를 호출 할 수 없습니다. 초기화 첫 단계가 끝나기 전에는 self도 참조 할 수 없습니다. 두 단계 초기화
  • 20. Phase 1 두 단계 초기화
  • 21. Phase 2 두 단계 초기화
  • 22. swift의 자식 클래스는 기본적으로 부모 클래스의 초기자를 상속 받지 않습니다 . (=! object-C) 초기자 상속과 오버라이딩
  • 23. 초기화 중간에 뭔가 수정 하기 위해서, 부모 클래스와 같은 초기자를 가진 자식 클래스가 필요 할 때, 자식 클래스에 같은 초기자를 오버라이딩 해서 구현 할 수 있습니다. 오버라이딩 하는 초기자가 지정 초기자라면, 오자식 클래스에서 구현체를 오버 라이드 하고, 오버라이딩 하는 버전에서 부모 버전의 초기자를 호출 하도록 할 수 있습니다. 초기자 상속과 오버라이딩
  • 24. Rule 1 자식 클래스가 지정 초기자를 정의하지 않는다. Rule 2 자식 클래스가 부모 클래스의 모든 지정 초기자를 구현한다. 초기자 자동 상속
  • 25. 편의 초기자는 convenience를 사용합 니다. convenience init(parameters) { statements } 클래스의 지정 초기자는 값 타입을 위 한 단순 초기자와 같은 방식으로 작성 한다. init(parameters) { statements } 지정 초기자, 편의 초기자의 문법
  • 26. class Food { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: “[Unnamed]”) } } 지정 초기자와 편의 초기자 실습
  • 27. class RecipeIngredient: Food { var quantity: Int init(name:String, quantity: Int) { self.quantity = quantity super.init(name: name) } convenience init(name: String) { self.init(name: name, quantity: 1) } } 지정 초기자와 편의 초기자 실습
  • 28. 지정 초기자와 편의 초기자 실습
  • 29. class RecipeIngredient: Food { var quantity: Int init(name:String, quantity: Int) { self.quantity = quantity super.init(name: name) } convenience init(name: String) { self.init(name: name, quantity: 1) } } 지정 초기자와 편의 초기자 실습
  • 30. class RecipeIngredient: Food { var quantity: Int init(name:String, quantity: Int) { self.quantity = quantity super.init(name: name) } convenience init(name: String) { self.init(name: name, quantity: 1) } } 지정 초기자와 편의 초기자 실습
  • 31. let oneMysteryItem = RecipeIngreidnet() let oneBacon = RecipeIngredient(name: “Bacon”) let sixEggs = RecipeIngredient(name: “Eggs”, quantity: 6) 지정 초기자와 편의 초기자 실습
  • 32. class ShoppingListItem: RecipeIngredient { var purchased = false var description: String { var output = “(quantity) x (name.lowercaseString)” output += purchased ? “V” : “X” return output } } 지정 초기자와 편의 초기자 실습
  • 33. class SomeClass { let someProperty: SomeType = { return someValue}() } 클로저나 함수로 기본 속성 값을 설정하 기
  • 34. 클로저나 함수로 기본 속성 값을 설정하 기
  • 35. 클로저나 함수로 기본 속성 값을 설정하 기

Editor's Notes

  • #8: 지역 파라메터는 init 안에서만 쓸 수 있는 파라메터이다. 외부 파라메터는 외부에서 init을 호출 할 때 반드시 이름을 magenta 를 초기화 하는 것 처럼 명시해야 한다. 그래서 veryGreen은 오류이다.
  • #9: 옵셔널은 그냥 int 가 아니라 int? / optional int 타입이다. toInt() 했을때 possibleNumber가 nil일 수 있다. 이 때 !를 통해서 강제 언래핑 하면 fatal exception이 발생 한다.
  • #11: 클래스 인스턴스는 상수 속성의 값을 오직 초기화 과정중에 해당 클래스에 의해서만 바꿀 수 있습니다. 상수 속성은 자식(sub) 클래스에 의해 변경될 수 없습니다
  • #12: 반드시 클래스의 모든 속성이 기본 값을 가지고 있어야 합니다. 그래야 자동으로 기본 초기자를 구현할 수 있습니다. 단, 옵셔널은 자동으로 기본값으로 nil을 받습니다.
  • #13: 구조체 타입은 자동으로 멤버 단위 초기자를 가진다. 단, 모든 저장 속성에 기본 값이 제공되고, 사용자 정의 초기자가 없어야 한다.
  • #14: 값 타입은 상속을 허용하지 않기 때문에 초기자를 대리하는게 상대적으로 쉽다. 왜냐하면 자기 자기가 가지고 있는 다른 초기자만 대리 할 수 있기 때문이다.
  • #18: 초기자 연쇄 지정초기자는 반드시 바로 위 부모 클래스의 지정 초기자를 호출한다. 편의 초기자는 반드시 같은 클래스 내의 초기자를 호출한다. 편의 초기자는 반드시 지정 초기자를 호출하는 것으로 끝내야 한다.
  • #19: 이렇게 두 단계 초기화를 함으로써, 초기화를 안전하게 하고, 상속 계층 상에서 유연성을 가진다. 속성 값이 초기화 되기 전에 접근하는 것을 반지, 다른 초기자 값을 설정하는 것을 방지 한다. 스위프트의 이 단계 초기화 과정은 오브젝티브 C의 초기화와 비슷합니다. 주요한 차이점은 첫번째 단계에 있습니다. 오브젝티브 C는 0이나 널(null) 값(0 또는 nil)을 모든 속성에 할당합니다. 스위프트의 초기화 흐름은 좀 더 유연하려 사용자 정의 초기값을 설정할 수 있게 해줍니다. 그리고 0이나nil이 기본값으로 유효하지 않은 타입에 대처할 수 있게 합니다.
  • #21: - 클래스의 지정 초기자 또는 편의 초기자 호출 - 클래스 인스턴스를 위한 메모리 할당 - 클래스 지정 초기자가 해당 클래스에있는 모든 저장속성이 값이 있는지 확인. 해당 저장 속성을 위한 메모리 초기화 완료. - 지정 초기자는 부모 클래스 지정 초기자로 작업을 넘겨줍니다. - 상속 계층의 맨 꼭대기까지 계속 됩니다. - 연쇄의 꼭대기에서 마지막 클래스는 모든 저장속성이 값을 가졌는지 확인하고, 인스턴스의 메모리는 완전히 초기화 되었습니다. 첫 단계를 종료합니다.
  • #22: 연쇄의 꼭대기에서 거꾸로 내려오면서 각각의 지정 초기자는 해당 클래스 인스턴스를 수정 할 수 있습니다. 초기자들은 이제 self에 접근하고, 프로퍼티를 수정 할 수 있습니다. 인스턴스 메소드도 호출 할 수 있습니다. - 끝으로, 모든 편의 초기자들은 해당 클래스 인스턴스를 수정 할 수 있고, self를 사용 할 수 있습니다.
  • #23: 이런 접근 방식은 더 복잡한 자식 클래스가 부모 클래스의 단순한 초기자를 자동으로 상속받아서 불완전하게 초기화되는 것을 막아줍니다.
  • #24: 아마도 초기화 도중에 클래스의 무엇인가를 수정 하고 싶을 때, 수정한 자식 클래스가 부모로 부터 초기자를 상속 받기를 원할 것 입니다. 이 때는 수정한 자식 클래스에 같은 초기자를 오버라이딩해서 구현 할 수 있습니다. 지정 초기자를 오버라이딩 한다면, 자식 클래스에서 구현체를 오버라이드 할 수 있고, 오버라이딩한 버전에서 부모 클래스 버전의 초기자를 호출 할 수 있습니다. 편의 초기자를 오버라이딩 하고싶으면, 오버라이드한 초기자는 반드시 자식클래스 안의 지정 초기자를 호출해야 합니다.
  • #25: 부모클래스의 모든 편의 초기자를 자동으로 상속한다. (Rule 1에 따라 지정 초기자를 상속 받아서 구현 하든가, 자식 클래스 정의의 일부로서 구현 할 수 있다.) 조건을 만족하면 자식 클래스가 자동으로 부모 클래스의 초기자를 상속 받습니다. 여기 진짜 말이긴데, 결국 자식 클래스가 부모 클래스의 모든 초기자를 구현해야 한다는 말이다.
  • #27: 클래스는 기본 멤버 단위 초기자가 없습니다. 그래서 Food 클래스는 단일 인자 name을 받는 초기자를 제공합니다. Food 클래스는 편의 초기자도 제공합니다.
  • #29: RecipeIngredient 클래스에는 한 개의 지정 초기자 init(name:String, quantity: Int)가 있습니다. 이 초기자는 RecipeIngredient 인스턴스의 모든 프로퍼티를 채우는데 쓰입니다. 이 초기자는 RecipeIngredient에서 새롭게 추가된 quantity에 값을 전달하면서 시작 합니다. 그리고나서, 이 초기자는 Food 클래스의 init(name:String)를 초기자를 대신 실행 합니다. 1단계는 해당 클래스가 가지는 저장속성에 초기값을 할당 한다. 입니다. 이 프로세스는 두 단계 초기화에서 1단계를 만족합니다.
  • #30: RecipeIngredient는 init(name:String)도 정의 하고 있다. 이 편리 초기자는 별다른 입력이 없는 모든 RecipeIngredient의 quantity를 1로 가정 했다. 이 편의 초기자는 단순히 클래스의 지정 초기자를 대리한다.
  • #31: RecipeIngredient의 init(name:String) 편의 초기자가 Food의 초기자 init(name:String)과 같은 파라메터를 받습니다. RecipeIngredient가 이 초기자를 편의 초기자로 제공하지만, RecipeIngredient는 모든 부모 클래스의 지정 초기자들을 구현한것이 된다. 그러므로, RecipeIngredient는 자동으로 모든 부모 클래스의 편의 초기자들을 상속받는다.
  • #32: 이 예제에서 RecipeIngredient의 부모클래스 Food는 하나의 편의 초기자 init()을 제공 합니다. 따라서 이 초기자는 RecipeIngredient에 상속 됩니다. init()의 상속된 버전은 Food 버전과 똑같이 기능 합니다. 대리 수행하는 초기자 init(name:String)을 Food 버전이 아니라 ReceipeIngredient 버전을 사용 한다는 것만 빼면요.
  • #33: 이 클래스가 도입한 모든 속성의 초기값을 제공하고, 어떤 이니셜라이저도 스스로 정의하지 않기 때문에 ShoppingListItem은 자동적으로 모든 지정 이니셜라이저와 편의 이니셜라이저를 부모 클래스에서 상속받습니다.
  • #34: 중괄호 바로 옆에 빈 괄호 한쌍이 있는 것은 클로저를 즉시 실행 하도록 한다. 이 괄호가 없으면 값이 아니라 클로저 자체를 속성에 할당 하려고 시도 하는 것이 된다. 알아야 할 점은 클로저가 호출되는 시점은 인스턴스의 나머지는 아직 초기화 되지 않은 상태이다. 따라서 self를 쓰거나 다른 메소드를 호출 할 수 없다.
  • #35: 중괄호 바로 옆에 빈 괄호 한쌍이 있는 것은 클로저를 즉시 실행 하도록 한다. 이 괄호가 없으면 값이 아니라 클로저 자체를 속성에 할당 하려고 시도 하는 것이 된다. 알아야 할 점은 클로저가 호출되는 시점은 인스턴스의 나머지는 아직 초기화 되지 않은 상태이다. 따라서 self를 쓰거나 다른 메소드를 호출 할 수 없다.