체인소맨?
옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을
가져오거나 호출할 때 사용할 수 있는 일련의 과정
예를 들어 Developer와 Company라는 구조체가 있다고 가정하자. Company에 developer가 아직 없을 수도 있어서 옵셔널로 체크해준다.
struct Developer {
var name: String
}
struct Company {
let name: String
var developer: Developer?
}
var developer = Developer(name:"Hong")
var company = Company(name:"Duhyeon", developer: developer)
print(company.developer)
이때 company
를 찍어보면 옵셔널에 묶인
"Optional(__lldb_expr_79.Developer(name: "Hong"))\n"
값이 나온다. 뭔가 이상하지만(?) 일단 다시 name까지 찍어보자.
print(company.developer.name)
// error : Value of optional type 'Developer?' must be unwrapped to refer to member 'name' of wrapped base type 'Developer'
어림도 없지 바로 에러가 나온다. 아직 Optional에 감싸져 있어서 얼른 풀어달라는 얘긴데 이때 조금은 가볍게 값을 풀어줄수 있다
print(company.developer?.name) // "Optional("Hong")\n"
print(company.developer!.name) // "Hong\n"
뒤에 ?과 !를 붙히는 방식 두가지로 할 수 있는데 둘다 뜻하는 바는 비슷한데 결과가 조금 다르다.
?를 사용했을 때 옵셔널을 벗겨내고 싶다면 옵셔널 바인딩을 사용하면 된다.