본문 바로가기

DEV/Swift

[Swift] Instance (인스턴스)

기존의 코드들을 보면

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 인스턴스 소멸