ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Optional
    ios/Etc 2022. 5. 27. 17:32
    728x90

    스위프트는 안전성을 매우 중요시하는 까다로운 언어이다. 

    이러한 안정성을 대표하는 중요한 요소 중 하나가 Optional이라는 개념이다.

    Optional은 Type casting이나 nil value(= null ) 체크 등에 있어서 중요한 역할을 한다.

     

    옵셔널

    • 값이 존재할 수도 있고 값이 존재하지 않을 수도 있다고 명시하는 것
    • 래핑된 값이 존재하거나 값이 없다는 nil을 표현하는 형식
    • 옵셔널로 정의한 변수와 그렇지 않은 변수는 서로 다른 타입이다.
    //옵셔널 변수를 정의할 때는 타입 어노테이션에 ?를 붙여야 한다.
    //옵셔널에 초깃값을 지정하지 않으면 기본값은 nil이다.
    var a:String?
    var b:String = "I'm b"
    
    //옵셔널 변수가 아니라면 nil을 할당할 수 없다.
    a = nil
    b = nil //Error: 'nil' cannot be assigned to type 'String'
    
    //옵셔널 변수와 그렇지 않은 변수를 서로 할당하려고 하는 경우
    b = a //Error: Value of optional type 'String?' must be unwrapped to a value of type 'String'
    
    a = b //Output: Optional("I'm b") 옵셔널로 랩핑된 값이 입력된다.

     

     

     

    옵셔널 바인딩 (Optional Binding)

    옵셔널 바인딩은 옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입시켜준다.

    var optionalEmail:String? = "hello@gmail.com"
    var optionalPwd:String? = "123456"
    
    if let email = optionalEmail { 
        print(email) // optionalEmail 값이 존재한다면 해당 값이 출력된다.
    }
    
    // optionalEmail 값이 존재하지 않는다면 if문을 그냥 지나친다.
    
    
    //여러 옵셔널을 바인딩 하려는 경우
    if let email = optionalEmail,
        pwd = optionalPwd{
        // email과 pwd 값이 존재
    }

     

    if let 혹은 if var를 사용하게 되는데 옵셔널의 값을 벗겨서 값이 있다면 if 문 안으로 들어가고, 값이 nil이라면 그냥 통과하게 된다.

     

     

    옵셔널 바인딩할 때 조건도 함께 지정할 수 있다. 이후의 조건절은 옵셔널 바인딩이 일어난 후에 실행된다.

    (옵셔널이 벗겨진 값을 가지고 조건을 검사하게 된다.)

    var optionalPwd:String? = "123456"
    
    if let pwd = optionalPwd, pwd.count >= 6 {
      //pwd 값이 존재하고, 길이가 6 이상이다.
    }
    
    // 위 코드는 아래와 같다.
    
    if let pwd = optionalPwd{
        if pwd.count >= 6{
        //pwd 값이 존재하고, 길이가 6 이상이다.
        }
    }

     

     

     

     

    옵셔널 체이닝 (Optional Chaining)

     

    옵셔널 체이닝은 nil일 수도 있는 프로퍼티나, 메소드 그리고 서브스크립트에 질의(query)를하는 과정이다. 만약 옵셔널이 프로퍼티나 메소드 혹은 서브스크립트에 대한 값을 갖고 있다면 그 값을 반환하고 만약 값이 nil이면 nil을 반환한다. 여러 질의를 연결해서 할 수도 있는데, 연결된 질의에서 어느 하나라도 nil이면 전체 결과는 nil이 된다.

     

    class Person {
        var name: String
        var job: String?
        var home: Apartment?
        
        init(name: String) {
            self.name = name
        }
    }
    
    class Apartment {
        var buildingNumber: String
        var roomNumber: String
        var guard: Person?
        var owner: Person?
        
        init(dong: String, ho: String) {
            buildingNumber = ding
            roomNumber = ho
        }
    }
    
    let yagom: Person? = Person(name: "yagom")
    let apart: Apartment? = Apartment(dong: "101", ho: "202")
    let superman: Person? = Person(name: "superman")
    
    //옵셔널 체이닝을 사용하지 않는다면
    func guardJobWithoutOptionalChaining(owner: Person?) {
        if let owner = owner {
            if let home = owner.home {
                if let guard = home.gaurd {
                    if let guardJob = guard.job {
                        print("우리집 경비원의 직업은 \(guardJob)입니다.")
                    }
                }
            }
        }
    }
    
    //옵셔널 체이닝을 사용한다면
    func guardJobWithOptionalChaining(owner: Person?) {
        if let guardJob = owner?.home?.guard?.job {
        // 만약 중간에 nil값이 존재하면 도중에 nil을 반환
            print("우리집 경비원의 직업은 \(guardJob)입니다.")
        } else {
            print("우리집 경비원은 직업이 없어요")
        }
    }

    옵셔널 체이닝은 옵셔널 값 뒤에 물음표(?)를 붙여서 표현 가능하다. 옵셔널 값을 강제 언래핑 하기위해서 뒤에 느낌표(!)를 붙이는 것과 문법이 비슷한데, 가장 큰 차이는 강제 언레핑을 했는데 만약 그 값이 없으면 런타임 에러가 발생하지만, 옵셔널 체이닝을 사용하면 런타임 에러 대신 nil이 반환 된다.

     

    옵셔널 체이닝에 의해 nil 값이 호출 될 수 있기 때문에 옵셔널 체이닝의 값은 항상 옵셔널 값이어야 한다. 옵셔널 값을 반환하지 않는 프로퍼티, 메소드 혹은 서브스크립트를 호출한다면 옵셔널 체이닝에 의해 옵셔널 값이 반환된다. 이 옵셔널 리턴 값을 이용해 옵셔널 체이닝이 성공적으로 실행 됐는지 아니면 nil을 반환 했는지 확인할 수 있다.

     

     

     

     

     

     

    참고

    https://developer.apple.com/documentation/swift/optional

    https://jusung.gitbook.io/the-swift-language-guide/

    https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html

    728x90

    'ios > Etc' 카테고리의 다른 글

    UITableView  (0) 2022.06.03
    MVC/MVVM  (0) 2022.05.27
    AutoLayout  (0) 2022.05.19
    Stroyboard Components  (0) 2022.05.19
    Xcode 기능들과 AppProject 속성  (0) 2022.05.19

    댓글

oguuk Tistory.