기존의 코드들을 보면
struct myStruct {
//모든 저장 프로퍼티에 기본값을 입력해둔 상태로 시작했음.
var myString:String = "String"
var myInt:Int = 0
}
//때문에 인스턴스 생성 후 필요에 따라 다시 사용될 값을 넣어줌.
//하지만 이 것은 좋은 방법이 아님.
var myInstance = myStruct()
myInstance.myInt = 3
myInstance.myString = "Hello"
때문에 인스턴스 생성 시 값을 정의하는 'init'을 사용함.
struct Jobs {
//기본값을 입력하지 않고
var jobName:String
var jobStrength:Int
//init(이니셜라이저): 이런식으로 초기화 틀 작성이 가능함.
init (job:String, str:Int) {
self.jobName = job
self.jobStrength = str}
}
//이니셜라이저된 인스턴스 사용법
var jim = Jobs(job: "Warrior", str: 32)
print("Jim's job is \(jim.jobName), strength is \(jim.jobStrength)")
초기값을 인스턴스 생성과 동시에 전달 인자에 입력해서 값을 지정함.
optional 프로퍼티가 존재하는 경우
struct Character {
var charName:String
var charJob:String
var charItem:String? //반드시 존재야하는 것이 아닌 경우 optional을 사용
//기본적으로 값이 존재해야만 하는 프로퍼티 초기화를 해 준 후
init(name:String, job:String) {
self.charName = name
self.charJob = job
}
//다시 init 생성해서 위의 init 사용 (중복 피하기)
//예제가 구조체가 아닌 클래스라면 'init' 앞에 'convenience' 추가
init(name:String, job:String, item:String) {
self.init(name: name, job: job)
self.charItem = item
}
}
var sofia = Character(name: "Sofia", job: "Priest") //item값이 nil이어도 생성 가능.
var julia = Character(name: "Julia", job: "Mage", item: "Staff")
실패가능한 initializing
struct Magic {
var magicName:String
var magicType:String
var magicPower:Int
//인스턴스 생성에 실패할 가능성이 있는 경우 init에 '?'붙여 optional 설정 함.
init? (mName:String, mType:String, mPower:Int) {
//magicName에 문자가 없거나, magicType에 문자가 없는 경우
if(mName.count == 0 || mType.count == 0) {
return nil //nil 값 반환
}
//magicPower 값이 0 미만이거나 100 초과일 때
if(mPower < 0 || mPower > 100) {
return nil //nil 값 반환
}
self.magicName = mName
self.magicType = mType
self.magicPower = mPower
}
}
var zeus = Magic(mName: "Wave", mType: "Attack", mPower: 88) //생성됨.
var fireball = Magic(mName: "FireBall", mType: "Attack", mPower: -2) //생성 실패 = nil
인스턴스 소멸 시 작동할 코드를 작성하고 싶다면 'deinit' 사용
//deinit: 인스턴스가 메모리에서 해제될 때 실행할 코드
class Family {
var name:String
var position:String
init(name:String, position:String) {
self.name = name
self.position = position
}
//deinit: 인스턴스 소멸 시 필요에 따라 실행될 코드 입력.
deinit {
print("\(name) is dead.")
}
}
//소멸 가능성이 있는 인스턴스 생성 시 타입에 '?'를 붙여줌.
var jason:Family? = Family(name: "Jason" , position: "Father")
var simpson:Family? = Family(name: "Simpson", position: "Son")
jason = nil //jason 인스턴스 소멸