Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Human interface guide
- Observable
- SWIFT
- 리펙토링
- Xcode
- ios
- RxCocoa
- swiftUI
- Refactoring
- swift documentation
- uitableview
- ribs
- HIG
- 리펙터링
- uiscrollview
- Clean Code
- UICollectionView
- Protocol
- collectionview
- map
- tableView
- clean architecture
- rxswift
- MVVM
- 애니메이션
- 스위프트
- 클린 코드
- UITextView
- combine
- 리팩토링
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[swift] 13. 초기화(init, convenience init, required init, override init) 본문
swift 5 문법
[swift] 13. 초기화(init, convenience init, required init, override init)
jake-kim 2020. 4. 17. 21:14let b = Boo()
원래의 의미는 "let b = Boo.init()"
1. init의 존재 이유
- 모든 저장 프로퍼티들은 초기화 되어야 함, init키워드는 이것을 도와줌
1
2
3
4
5
6
7
8
9
10
11
|
class Test{
var a:Int! // nil로 초기화
var b:Int? // nil로 초기화
var c: Int // init으로 초기화
var d: Int // error
init(tmp: Int){
self.c = tmp
}
}
|
(d변수가 초기화 되지 않아서 error)
2. 초기화의 종류
1) 초기화 메소드의 델리게이션: super.init()
(연쇄적인 초기화)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class A{
var a: Int
init(value: Int) {
self.a = value
}
}
class B: A{
init(value1: Int, value2: Int) {
}
}
class C: B {
init(value1: Int, value2: Int, value3: Int) {
}
}
|
2) 지정 초기화 메소드 (Designated Initializer)
- 서브 클래싱시 꼭 초기화 해줘야 하는 메소드 : init(...)으로 작성
* required init은 서브클래스에서 super.init이 아닌, 직접 구현해야 하는 초기화메소드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class A{
var a: Int
init(value: Int) {
self.a = value
}
required init (val1: Int, val2: Int, val3: String){
self.a = val1
}
}
class B: A{
required init(val1: Int, val2: Int, val3: String) {
}
}
|
3) 편의 초기화 메소드 (Convenience Initializer)
- convenience init(...) : 현재 정의되어 있는 초기화메소드를 불러서 추가적인 내용을 덫 붙이는 것
※ convenience가 아닌 init키워드는 블록안에 self.init과 같이 다른 초기화 메소드를 부를 수 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class A{
var a: Int
var name: String!
init(val1: Int, val2: String) {
self.a = val1
self.name = val2
}
convenience init(newVal: Int) {
self.init(val1: newVal, val2: "imustang")
}
}
|
3. init의 오버로딩과 오버라이딩
서브클래싱시, 수퍼 클래스에서 init키워드로 작성된 것은 꼭 super로 초기화 필요
1) 오버로딩 : 같은 이름의 메소드, 다른 매개변수 or 다른 리턴 타입
(안할 시 a변수가 초기화 안된 상태로 남아있음)
class A{
var a: Int
init(inValue: Int) {
self.a = inValue
}
}
class B: A{
var b: Int
init(inValue: Int, inValue2: Int) {
self.b = inValue2
super.init(inValue: inValue)
}
}
2) 오버라이딩 : 메소드 이름, 매개변수, 리턴타입 모두 같아야함
서브클래싱시, 수퍼클래스와 같은 초기화 이름으로 할 땐 override init으로 선언
class A{
var a: Int
init(inValue: Int) {
self.a = inValue
}
}
class B: A{
var b: Int
override init(inValue: Int) {
self.b = inValue
super.init(inValue: inValue)
}
}
'swift 5 문법' 카테고리의 다른 글
[swift] 15. 객체지향 vs 함수형 (0) | 2020.04.20 |
---|---|
[swift] 14. 접근 제한자(private, fileprivate, internal, public, open) (0) | 2020.04.18 |
[swift] 12. 예외 처리 (throws, throw, do - try - catch) (3) | 2020.03.29 |
[swift] 11. 프로토콜 (protocol) (0) | 2020.03.29 |
[swift] 10. 열거형과 익스텐션 (0) | 2020.03.29 |
Comments