[Swift 문법] 옵셔널 체이닝

!·2022년 8월 17일
0

Swift 문법

목록 보기
22/27

옵셔널 체이닝

  • 옵셔널 체이닝은 옵셔널에 속해있는 nil 일지도 모르는 프로퍼티, 메소드, 서브스크립트 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다. 옵셔널에 값이 있다면 값을 추출할 수 있고, 값이 없다면 nil 을 반환한다.
    옵셔널이 자전거 체인처럼 꼬리를 물고 이어져있기 때문에 옵셔널 체이닝 이라고 부른다.

!

  • 옵셔널 체이닝에서 ? 대신 ! 을 사용하는 경우는 2가지 차이가 있다. 첫번째는 ? 을통해 옵셔널 값을 추출한다면 nil 인 경우 nil 을 반환하지만, ! 인 경우에는 런타임 에러 가 발생하기때문에 왠만하면 ? 을 사용하는 것이 좋다.
class Room{
    var number: Int
    
    init(number: Int){
        self.number = number
    }
}

class Building {
    var name: String
    var room: Room?
    
    init(name: String){
        self.name = name
    }
}

struct Address{
    var province: String
    var city: String
    var street: String
    var building: Building?
    var detailAddress: String?
}

class Person{
    var name: String
    var address: Address?
    
    init(name: String){
        self.name = name
    }
}

let yagom: Person = Person(name: "yagom")

let yagomRoomViaOptionalChaining: Int? = yagom.address?.building?.room?.number
let yagomRoomViaOptionalUnwrapping: Int = yagom.address!.building!.room!.number

옵셔널 체이닝을 통한 값 할당

yagom.address?.building?.room?.number = 505
print(yagom.address?.building?.room?.number) // nil


yagom.address = Address(province: "충북 청주", city: "청주시 청원구", street: "충청대로", building: nil, detailAddress: nil)
yagom.address?.building = Building(name: "곰굴")
yagom.address?.building?.room = Room(number: 0)
yagom.address?.building?.room?.number = 505

print(yagom.address?.building?.room?.number) // Optional(505)
  • 옵셔널 체이닝을 통해 address 프로퍼티에 접근하는 경우 nil 이기 때문에 바로 nil 이 반환된다.
  • 이니셜 라이저를 통해 각 프로퍼티를 초기화하면서 값을 할당해야 한다.

옵셔널 체이닝을 통한 메소드 호출

struct Address{
    var province: String
    var city: String
    var street: String
    var building: Building?
    var detailAddress: String?
    
    init(province: String, city: String, street: String){
        self.province = province
        self.city = city
        self.street = street
    }
        
    func fullAddress() -> String?{
        var restAddress: String? = nil
        
        if let buildingInfo: Building = self.building{
            
            restAddress = buildingInfo.name
            
        }else if let detail = self.detailAddress{
            
            restAddress = detail
        }
        
        if let rest: String = restAddress{
            var fullAddress: String = self.province
            
            fullAddress += " " + self.city
            fullAddress += " " + self.street
            fullAddress += " " + rest
            
            return fullAddress
        }else{
            return nil
        }
    }
        
    func printAddress(){
        if let address: String = self.fullAddress(){
            print(address)
        }
    }
    
}

yagom.address?.fullAddress()?.isEmpty // false
yagom.address?.printAddress() // 충청북도 충주시 청원구 충처ㅣ....

옵셔널 체이닝을 통한 서브스크립트 호출

let optionalArray : [Int]? = [1,2,3]
optionalArray?[1] //

var optionalDictionary: [String: [Int]]? = [String: [Int]]()
optionalDictionary?["numberArray"] = optionalArray
optionalDictionary?["numberArray"?[2] // 3
  • 옵셔널 체이닝을 통한 서브스크립트 호출은 [] 앞에 ? 를 붙인다.
profile
개발자 지망생

0개의 댓글