Optional Chaining


  • トーナメントの結果はトーナメントです.
  • の傍観者フィルタを含む式では、nilが1つある場合、後続の式は確認されず、nilが返されます.
  • struct Contacts {
       var email: [String: String]
       var address: String?
        
        
        func printAdress() {
            return print(address ?? "no adress")
        }
    }
    
    struct Person {
       var name: String
       var contacts: Contacts?
    
       init(name: String, email: String) {
          self.name = name
          contacts = Contacts(email: ["home": email], address: "Seoul")
       }
        
        func getContacts()-> Contacts? {
            return contacts
        }
    
    }
    
    var  p = Person(name: "James", email: "[email protected]")
    let a = p.contacts?.address//마지막 값이 옵셔널이라면 ?를 붙일 필요 없다,
    
    var optionalP : Person? = Person(name: "James", email: "[email protected]")
    let b = optionalP?.contacts?.address 
    // optionalP에 값이 저장되어있다면 contacts속성에 접근하고 그렇지 않다면 바로 종료된다.
    
    b // Seoul - optional String
    
    optionalP = nil
    let c = optionalP?.contacts?.address
    c // nil - optional String
    
    
    

    optionaタイプがないため、Stringタイプは最後の式に従って返されます.

    中間にはクラスタ外式があり、最後の式に基づいてタイプを決定し、optional Stringを返します.

    nil値が中央に表示されている場合は、nilを返し、式をすぐに終了します.ただし、返されるタイプは最後の式に依存します.
    
    
    p.getContacts()?.address // 함수에서 옵셔널 값을 리턴할때는 ()뒤에 ?를 작성해야한다.
    
    let f: (()->Contacts?)? = p.getContacts
    
    //f()?.address // 컴파일 에러 함수 자체가 옵셔널 타입이기 떄문에
    f?()?.address // 이런식으로 함수 이름 뒤에도 ?를 붙여야한다.
    
    let d = p.getContacts()?.printAdress() 
    // 현재 타입은 optional Void 타입으로 Void는 값을 리턴하지 않는다는 키워드 이다. 
       하지만 nil 값이 아니므로 adress가 출력된다.
    
    if p.getContacts()?.printAdress() != nil { // 호출되었는지 확인하기
        
    }
    
    if let _ = p.getContacts()?.printAdress() { 
    //값이 호출된 경우에만 바인딩이 성공하지만 보이드 타입이기 때문에 
    값이 리턴될 필요가 없기 때문에 와일드 카드 패턴을 사용한다.
        
    }
    
    let e = p.contacts?.email["home"] 
    // 만약 email dictionary가 옵셔널이라면 email?["home"]이렇게 작성되어야한다.
    
    p.contacts?.email["home"]?.count 
    // 이럴떄는 key와 연관된 값이 없을수 있기때문에 []뒤에 ?을 붙인다.
    
    p.contacts?.address = "Deagu" 
    // 새로운값 저장 여기서는 모든 표현식이 nil이 아니기 때문에 "Deagu"가 변경된다
    
    optionalP?.contacts?.address = "Deagu" 
    // optionalP가 nil이기때문에 식이 첫번째 이후로 종료되어 아무런 변화없가 없다.