반응형
프로퍼티 기본값
Swift에선 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어야 합니다.
미리 기본값을 할당하면 생성과 동시에 초기값을 지니게 됩니다.
class Someone {
var name = "미입력"
var age = 0
func call() { print( "\(self.name)은 \(self.age)살 입니다." ) }
}
let greensky: Someone = Someone ()
greensky.call() //미입력은 0살 입니다.
greensky.name = "Greensky"
greensky.age = 20
greensky.call() //Greensky은 20살 입니다.
이니셜라이저 사용
기본값 지정이 불가능하거나 사용이 어려운 경우엔 이니셜라이저를 사용합니다.
class Someone {
var name : String
var age : Int
init(name: String, age: Int){
self.name = name
self.age = age
}
func call() { print( "\(self.name)은 \(self.age)살 입니다." ) }
}
let greensky: Someone = Someone (name: "Greensky", age: 20)
greensky.call() //Greensky은 20살 입니다.
옵셔널 사용
프로퍼티의 초기값이 필요없을 때 사용합니다.
class Someone {
var name : String
var age : Int
//옵셔널 사용
var height : Int?
init(name: String, age: Int){
self.name = name
self.age = age
}
init(name: String, age: Int, height: Int){
self.name = name
self.age = age
self.height = height
}
}
let greensky: Someone = Someone (name: "Greensky", age: 20)
let bluesky: Someone = Someone (name: "Greensky", age: 20, height = 200)
단, 이후에 height를 사용하려면 옵셔널 체크는 필수겠죠?
암시적 추출 옵셔널을 사용할수도 있습니다.
인스턴스 사용에 꼭 필요하지만 초기값을 할당하지 않을 때 사용합니다.
class Someone {
var name : String
var friend : Someone!
init(name: String, age: Int){
self.name = name
}
func print(){ Swift.print( "\(name)는 \(friend.name)와 친구입니다.") }
}
let person1: Someone = Someone (name: "애니")
let person2: Someone = Someone (name: "아무무")
person1.print() // error
person1.friend = person2
person1.print() //애니는 아무무와 친구입니다.
실패가능한 이니셜라이저
이니셜라이저 매개변수로 전달되는 값이 잘못된 경우 생성에 실패할 수 있습니다.
생성 실패시 nil을 반환합니다.
따라서, 실패가능한 이니셜라이저의 반환타입은 옵셔널 타입이 되겠습니다.
class Someone {
var name: String
var age: Int
var friend: Someone!
init(name: String, age: Int){
if(60...100).contains(age) == false{
return nil
}
if name.characters.coount == 0{
return nil
}
self.name = name
self.age= age
}
func print(){ Swift.print( "\(self.name)는 \(self.age= age)살입니다..") }
}
let park : Someone? = Someone(name: "park", age : 999)
let lee : Someone? = Someone(name: "", age : 20)
print(park) // nil
print(lee) // nil
디이니셜라이저
deinit는 클래스 타입에만 구현할 수 있습니다.
이는 인스턴스게 메모리에서 해제되는 시점에 호출됩니다.
자동으로 호출되므로 직접 호출할 수는 없습니다.
메모리에서 해제되는 시점은 ARC라는 규칙을 따르는데, 공식문서 참고하시면 되겠습니다
class Someone {
var name = "녹색하늘"
var age = 20
deinit {
print("\(self.name)이 메모리에서 사라집니다.")
}
}
var greensky: Someone? = Someone()
greensky = nil //녹색하늘이 메모리에서 사라집니다.
print(greensky) //nil
공부에 도움이 된 사이트
반응형
'Language > Swift' 카테고리의 다른 글
Swift Assert와 Guard (0) | 2021.03.14 |
---|---|
Swift 타입캐스팅 (형변환) (0) | 2021.03.13 |
Swift 프로퍼티 타입들 (0) | 2021.03.12 |
Swift 클로저 (0) | 2021.03.11 |
Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리] (0) | 2021.03.11 |