$0이 nil이 아닌 것을 filter했기 때문에 당연히 $0은 nil이 아니라고 생각하고 $0!을 출력하는 간단한 예시이다.
let ages = [
"Tim": 53,"Angela":54,"Craig":44, "Jony": 47, "Chris": 37, "Michael": 34,
]
// Force-unwrap
ages.keys
.!lter { name in ages[name]! < 50 }
.sorted()
// not force-unwrap(권장)
ages
.!lter { (_, age) in age < 50 }
.map { (name, _) in name }
.sorted()
모두 키 값이 존재하기 때문에 nil이 아니라고 생각하고 !를 출력하는 예시를 보여준다.
Force-Unwrap 에러 메세지
!! 연산자를 사용한 정의 함수로 메세지를 커스텀할 수 있다.
infix operator !!
func !! <T>(wrapped: T?, failureText: @autoclosure () -> String) -> T { ifletx=wrapped{returnx}
fatalError(failureText())
}
let s = "foo"
let i = Int(s) !! "Expecting integer, got \\"\\(s)\\""
wrapped가 nil일 경우 fatalError를 발생시켜 메세지를 출력한다.
빌드 환경에 따라 assert 선택
릴리즈 빌드에서는 크래시를 선택하는 방법보다는 유효한 default값을 지정하는 방법을 권고하고 있다.
!?연산자를 사용한 정의 함수로 unwrap 실패시 assert하고 릴리즈 빌드에서는 기본값으로 대체하도록 할 수 있다.
아래를 예시로 설명하면,
assert(wrapped != nil, failureText())는 디버그 에서만 동작하고
릴리즈에서는 return 문이 동작하여 nil일 경우 기본값이 출력되도록 처리한다.