not bad 한 개발

Swift - Failable Initializers(실패 가능한 생성자) 본문

Swift

Swift - Failable Initializers(실패 가능한 생성자)

leebean 2021. 10. 23. 13:57

(인덕대학교 컴퓨터소프트웨어학과 iOS프로그래밍기초(21-2학기)한성현 교수님 강의 내용을 변형 및 요약 했습니다.)

Failable Initializers(실패 가능한 생성자)

  • Swift언어를 사용하여 iOS 앱을 만들경우 UIKit 안에 있는 함수 중에는 끝에 "!"가 붙어있는 함수가 있습니다.
  • 조건에 맞는 파일이 없는 경우 인스턴스를 만들 수 없고 nil값도 저장할 수 있으려면 init다음에 "?"(언래핑)을 하여 옵셔널 값이 리턴되게 해야 합니다.
  • init?로 만든 인스턴스는 옵셔널형으로 만들어져서, 사용하려면 옵셔널을 언래핑해야 해서 위 제일 마지막에 “!”가 있습니다.

 

(Failable Initializers 가 있는 인스턴스 생성 예제)

class woMan {
    var age1 :Int
    var weight2 :Double 
    func disPlay (){
        print ("나이:\(age1), 무게:\(weight2)")
    }
    init?(myAge :Int , myWeight :Double ){
       if myAge <=0 {
           return nil
       }
       else {
           self.age1 = myAge
       }
       self.weight2 = myWeight
    }//failable initializer
}
var Lee : woMan = woMan (myAge :31 , myWeight :60.5 )!
//failable initializer을 호출하면 일반클래스의 자료형이 아닌 옵셔널타입으로 나옵니다.
//일반형으로 사용하고싶으면 강제언래핑을 하면 됩니다.
var Lee1 : woMan = woMan (myAge :0 , myWeight :50.5 )!
//조건에서 0이하이면 nil을 반환하게 했는데 강제로 언래핑하여 crash 되어 
//다운이 된 것 입니다.
//그렇기에 바로 언래핑을 하는 것은 위험합니다.
Lee.disPlay ()
Lee1.disPlay ()

 

(Failable Initializers 올바르게 사용하는 방법)

class woMan {
    var age1 :Int
    var weight2 :Double 
    func disPlay (){
        print ("나이:\(age1), 무게:\(weight2)")
    }
    init?(myAge :Int , myWeight :Double ){
       if myAge <=0 {
           return nil
       }
       else {
           self.age1 = myAge
       }
       self.weight2 = myWeight
    }//failable initializer
}
//1-1.옵셔널 형으로 선언
var Lee : woMan? = woMan (myAge :10 , myWeight :20.5 )
//1-2 옵셔널 바인딩
//nil값일 경우에도 조건문이 참이 아니기 때문에 crash가 나지 않습니다.
if let Lee1 = Lee {
    Lee1.disPlay ()//나이:10, 무게:20.5
}
 
//2.인스턴스 생성과 동시에 옵셔널 바인딩
//nil값일 경우에도 조건문이 참이 아니기 때문에 crash가 나지 않습니다.
if let Lee2 = woMan (myAge :20 , myWeight :30.5 ){
    Lee2.disPlay ()//나이:20, 무게:30.5
}
 
//3.인스턴스 생성하면서 바로 강제 언래핑
//nil값일 경우 crash가 일어나기 때문에 좋은방법은 아닙니다.
var Lee3 : woMan = woMan (myAge :30 , myWeight :40.5 )!
Lee3.disPlay ()//나이:30, 무게:40.5
 
//4.옵셔널 인스턴스를 사용시 강제 언래핑
//nil값일 경우 crash가 일어나기 때문에 좋은방법은 아닙니다.
var Lee4 : woMan? = woMan (myAge :40 , myWeight :50.5 )
Lee4 !.disPlay ()//나이:40, 무게:50.5

'Swift' 카테고리의 다른 글

Swift - overloading(생성자 중첩)  (0) 2021.11.03
Swift - window VS Mac  (0) 2021.10.28
Swift - property(프로퍼티)  (0) 2021.10.23
Swift - self  (0) 2021.10.23
Swift - 인스턴스 초기화하기  (0) 2021.10.23
Comments