정의
초기화 = 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계입니다.
이 단계에서 저장 프로퍼티의 초기 값을 설정.
초기화 과정은 initializer를 정의 하는 것으로 구현 할 수 있습니다.
initializer는 값을 반환하지 않으며 초기화와 반대로 여러 값과 자원을 해지시키는 deinitializer도 있습니다.
-
인스턴스가 생성 되었을 때, 기본값(초기화 과정)이 필수적으로 있어야합니다.
이 과정에서 이니셜라이저를 사용하면 프로퍼티 기본값을 사용하지 않더라도
실제로 인스턴스가 초기화될 때 원하는 값들을 초기화시킬 수 있습니다.
이니셜라이저의 사용
이니셜라이저는 특정 타입의 인스턴스를 생성합니다.
아래의 형식은 가장 간단한 형태로 파라미터가 없이 init 키워드를 사용하는 방법입니다.
-
이니셜라이저는 일종의 함수이기도 하지만,
init 키워드 앞에 func를 작성하지 않고 작성할 수 있으며 괄호 안에 파라미터들을 작성해
코드블록에 파라미터의 값을 초기화하는 저장 프로퍼티를 작성할 수 있습니다.
형식
init( ) {
// 코드작성
}
예제
다음 예제는 Introduce 클래스에서 name이라는 프로퍼티를 선언하고,
이니셜라이저를 통해 name 프로퍼티의 값을 초기화하는 코드입니다.
class Introduce {
var name: String
init(){
name = "철수"
}
}
var I = Introduce()
print("안녕하세요, 저는 \(I.name)입니다.")
실행결과
// 안녕하세요, 저는 철수입니다.
옵셔널 프로퍼티 타입
프로퍼티 중 초기값이 필요없거나 나중에 추가될 수 있는 초기값을 사용하기위해
옵셔널을 사용할 수 있습니다.
예제
옵셔널 프로퍼티는 자동으로 nil값이 됩니다.
class Man {
var name: String
var age: Int
var nickName: String?
init(name: String, age: Int, nickName: String){
self.name = name
self.age = age
self.nickName = nickName
}
init(name: String, age: Int){
self.name = name
self.age = age
}
}
let A = Man(name: "짱구", age: 5, nickName: "신노스케")
let B = Man(name: "철수", age: 5)
암시적 추출 옵셔널
옵셔널 프로퍼티 타입의 반대의 경우로
꼭 필요한 프로퍼티가 있을땐 옵셔널 ! 를 사용하면 됩니다.
예제
직전의 예제와 이어지는 예제입니다.
마지막 부분에 happy.owner 값을 주지 않는 경우 오류가 발생하게됩니다.
class Man {
var name: String
var age: Int
var nickName: String?
init(name: String, age: Int, nickName: String){
self.name = name
self.age = age
self.nickName = nickName
}
init(name: String, age: Int){
self.name = name
self.age = age
}
}
class Puppy {
var name: String
var owner: Man!
init(name: String){
self.name = name
}
func goOut() {
print("\(name)가 주인 \(owner.name)과 산책합니다.")
}
}
let happy: Puppy = Puppy(name: "happy")
happy.owner = tom
happy.goOut
실패가능한 이니셜라이저
이니셜라이저 매개변수로 전달되는 초기값이 잘못된 경우 인스턴스 생성에 실패할 수 있습니다.
실패하면 nil을 반환하며, 반환타입이 옵셔널 타입이기때문에 init? 키워드를 사용합니다.
예제
다음 코드에서는 joker의 age값이 범위를 넘었기 때문에, nil 값으로 초기화됩니다.
class test {
var name: String
var age: Int
var nickName: String?
init?(name: String, age: Int) {
if (0...120).contains(age) == false {
return nil
}
self.name = name
self.age = age
}
}
let john: test? = test(name: "john", age: 23)
let joker: test? = test(name: "joker", age: 123)
print(john)
print(joker)
디이니셜라이저
클래스 인스턴스가 메모리에서 해제되는 시점에 자동으로 호출됩니다.
그렇기때문에 인스턴스가 해제되는 시점에서 해야할 기능을 구현할 수 있습니다.
예제
변수 A에 대한 값을 nil로 변경시켰기때문에, A인스턴스가 더 이상 필요하지않아 메모리에서 해제되며
deinit가 작동되며 Exit를 출력하며 종료됩니다.
class test{
var name: String
var age: Int
var NickName: String?
init(name: String, age: Int){
self.name = name
self.age = age
}
deinit{
print("Exit")
}
}
var A: test? = test(name: "minwoo", age: 20)
A = nil
내용 참고, 출처
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
값 타입과 참조 타입 (0) | 2022.01.31 |
---|---|
extensions (0) | 2022.01.30 |
guard (0) | 2022.01.28 |
assert (0) | 2022.01.28 |
타입캐스팅 (0) | 2022.01.26 |
댓글