선택적 바인딩
스위프트 3 & 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
스위프트 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
코드는 let booleanValue = booleanValue
반환 false
경우 booleanValue
입니다 nil
과 if
블록이 실행되지 않습니다. 하면 booleanValue
되지 nil
,이 코드라는 새로운 변수 정의 booleanValue
유형 Bool
(대신, 선택의을 Bool?
).
Swift 3 & 4 코드 booleanValue
(및 Swift 2.2 코드 where booleanValue
)는 새 booleanValue: Bool
변수를 평가합니다 . 참이면 if
블록은 booleanValue: Bool
범위에서 새로 정의 된 변수로 실행됩니다 (옵션이 if
블록 내에서 바인딩 된 값을 다시 참조하도록 허용 ).
참고 : 바인딩 된 상수 / 변수의 이름을 .NET과 같은 선택적 상수 / 변수와 동일하게 지정하는 것은 Swift 규칙 let booleanValue = booleanValue
입니다. 이 기술을 가변 섀도 잉 이라고 합니다 . 관습에서 벗어나 let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. 나는 무슨 일이 일어나고 있는지 이해하는 데 도움이되도록 이것을 지적합니다. 가변 섀도 잉을 사용하는 것이 좋습니다.
기타 접근법
병합 없음
이 특정 경우에는 병합이 명확하지 않습니다.
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
확인 false
이 명확하지 않습니다.
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
참고 : if !booleanValue ?? false
컴파일되지 않습니다.
강제 풀기 선택 사항 (사용하지 않음)
강제 언 래핑은 누군가가 나중에 컴파일되지만 런타임에 충돌하는 변경을 수행 할 가능성을 높입니다. 따라서 다음과 같은 것을 피할 것입니다.
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
일반적인 접근 방식
이 스택 오버플로 질문은 a Bool?
가 문 true
내에 있는지 확인하는 방법을 구체적으로 묻지 만 if
참, 거짓을 확인하거나 래핑되지 않은 값을 다른 표현식과 결합하는지 여부를 확인하는 일반적인 접근 방식을 식별하는 것이 좋습니다.
표현이 복잡 해짐에 따라 선택적 바인딩 접근 방식이 다른 접근 방식보다 더 유연하고 이해하기 쉽습니다. 선택적 유형 (와 그 옵션 바인딩 작업 참고 Int?
, String?
등).