일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- Foundation
- Git
- 스위프트
- delegate
- IOS
- Class
- String
- type
- Unicode
- url
- struct
- Method
- enum
- instance
- property
- 이니셜라이저
- initalizer
- extension
- Protocol
- optional
- Terminal
- initializer
- interpace
- init
- tuist
- UIKit
- 디자인패턴
- Xcode
- Swift
- Today
- Total
아리의 iOS 탐구생활
[Swift] 이니셜라이저(initalizer) / 값타입에서의 사용 [2] 본문
✔️ Struct’s initalizer
종류
🔍 Memberwise initalizer
구조체 내에 프로퍼티가 하나라도 초기화 되지 않은 경우, 초기값이 없는 속성을 매개변수로 갖는 Memberwise initalizer가 제공된다.
속성이 모두 let으로 값까지 모두 초기화 되어있는 경우에는 Memberwise initalizer는 제공되지 않는다.
🔍 기본 initalizer
프로퍼티가 모두 초기화 되어있는 경우 매개변수가 없는 initalizer가 제공된다.
struct Sample {
let own: Int
let two: String
let three: Bool
}
let test1 = Sample(own: 1, two: "문자열", three: true) // Memberwise initalizer
struct SampleOwn {
var say: String = "own"
}
let testOwn = SampleOwn() // 기본 initalizer
let testTwo = SampleOwn(say: "two") // Memberwise initalizer
struct SampleTwo {
let say: String = "own"
}
let testThree = SampleTwo() // 기본 initalizer
🔍 Initializer Delegation for Value Types
이니셜라이저는 다른 이니셜라이저를 호출하여 인스턴스 초기화의 일부를 수행할 수 있다. 이를 initalizer 위임이라고 한다.
struct Frame {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(y: Int) {
self.init(x: 0, y: y) // 다른 initalizer를 호출
}
}
let test = Frame(x: 10, y: 5)
print(test) // Frame(x: 10, y: 5)
let testCopy = Frame(y: 10)
print(testCopy) // Frame(x: 0, y: 10)
🔍 initalizer Extension for Value Types
Extension 본연의 의미 그대로 처음에 구현하지 않고 추후에 initalizer를 추가로 구현할 수도 있다.
self.init은 initalizer를 작성할 때만 호출할 수가 있는데, 구조체나 열거형에서 사용자 정의 initalizer를 구현하면 default initalizer나 memberwise initalizer를 더 이상 접근할 수 없다. 이러한 제한은 initalizer를 만들어뒀지만 누군가가 사용할 때 이를 사용하지 않고 기본적으로 제공되는 initalizer를 사용하여 발생하게 되는 오류를 방지할 수 있다. 이러한 제한이 싫고 default initalizer도 사용하고 사용자 정의 initalizer도 사용하고 싶다면 Extension으로 확장해주면 되겠다.
struct Frame {
var x: Int = 1
var y: Int = 1
}
extension Frame {
init(value: Int) {
self.init(x: value, y: value) // 다른 initalizer를 호출
}
}
let own = Frame(x: 10, y: 5) // Memberwise initalizer
let two = Frame(value: 10) // 사용자 정의
let three = Frame() // Default initalizer
✔️ Enum’s initalizer
열거형은 rawValue가 있는 경우 rawValue로부터 인스턴스를 생성할 수 있는 실패가능한 initalizer가 기본으로 제공된다.
열거형의 case들을 초기화해주는 것은 가능하지만 rawValue는 상수이기 때문에 초기화 해줄 수 없다.
enum Color: String {
case red
case blue
case yellow = "노랑"
init(color: Character) {
switch color {
case "r", "R":
self = .red
case "b", "B":
self = .blue
default:
self = .yellow
}
}
}
let own = Color(color: "R") // red
let two = Color(rawValue: "레드") // nil
let three = Color(rawValue: "노랑") // yellow
✔️ Apple 공식문서 참고
'Swift > 문법' 카테고리의 다른 글
[Swift] Protocol 1) 기본 개념 (0) | 2021.08.18 |
---|---|
[Swift] 이니셜라이저(initalizer) / 참조타입에서의 사용 [3] (0) | 2021.08.15 |
[Swift] 이니셜라이저(initalizer) / 기본 개념 [1] (0) | 2021.08.13 |
[Swift] Class와 Struct에 대해서 알아보자. (0) | 2021.08.13 |
[Swift] Function inout parameter? (0) | 2021.08.12 |