옵션 Bool 값 확인
옵션 Bool이 참인지 확인하고 싶을 때 이 작업을 수행해도 작동하지 않습니다.
var boolean : Bool? = false
if boolean{
}
다음 오류가 발생합니다.
선택적 유형 '@IvalueBoole?'은(는) 부울로 사용할 수 없습니다. 대신 '!= nil'에 대해 테스트하십시오.
0을 확인하고 싶지 않습니다. 반환된 값이 참인지 확인하고 싶습니다.
항상 해야 합니까?if boolean == true내가 선택적인 Bool과 일하고 있다면요?
옵션이 다음을 준수하지 않기 때문입니다.BooleanType더 이상 컴파일러는 제가 Bool의 값을 확인하고 싶어한다는 것을 알아야 하지 않나요?
선택적 부울을 사용할 경우 확인을 명시적으로 수행해야 합니다.
if boolean == true {
...
}
그렇지 않으면 옵션 포장을 해제할 수 있습니다.
if boolean! {
...
}
▁boolean▁is▁a▁if▁but▁that▁exception▁generates인 경우에는 런타임 예외가 발생합니다.nil이를 방지하기 위해:
if boolean != nil && boolean! {
...
}
베타 5 이전에는 가능했지만 릴리스 노트에 보고된 대로 변경되었습니다.
옵션은 더 이상 값이 있으면 true로, 그렇지 않으면 false로 암묵적으로 평가하지 않으므로 옵션 Bool 값으로 작업할 때 혼동을 방지합니다.대신 == 또는 != 연산자를 사용하여 0에 대해 명시적으로 확인하여 옵션에 값이 포함되어 있는지 확인합니다.
부록: @MartinR에서 제안한 바와 같이, 세 번째 옵션의 더 작은 변형은 병합 연산자를 사용하는 것입니다.
if boolean ?? false {
// this code runs only if boolean == true
}
0이 값으로 랩되지 않은 값 ). 경우 즉, 부 0 이로 됩니다. 그렇지 않을 경우 표현식은 다음과 같이 평가됩니다.false
선택적 바인딩
스위프트 3 & 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
// Executes when booleanValue is not nil and true
// A new constant "booleanValue: Bool" is defined and set
print("bound booleanValue: '\(booleanValue)'")
}
스위프트 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
// Executes when booleanValue is not nil and true
// A new constant "booleanValue: Bool" is defined and set
print("bound booleanValue: '\(booleanValue)'")
}
드let booleanValue = booleanValue아온다를 합니다.false한다면booleanValue이라nil 리고그고.if블록이 실행되지 않습니다. 만약booleanValue아닙니다nil는 " 코는이가름새변진정수다의니합를로운이을드▁named다니"라는 새로운 합니다.booleanValueBool 사항 )Bool?).
3 & 4 스프트 3 & 4드booleanValue 2 코드(Swift 2.2 코드 포함)where booleanValue에서 새 )를 합니다.booleanValue: Bool변수.만약 그것이 사실이라면,if은 새로 된 블이새정값실으행으로 됩니다.booleanValue: Boolscope ( 내 변수 에서 경계값을 할 수 합니다.)if블록).
상수/을 참: 된변상수변이바의름/선상지와일다하정것게니이약하입는고와 같은 선택적인 상수/변수와 동일하게 붙이는 것이 Swift 규약입니다.let booleanValue = booleanValue이 기법을 가변 쉐이딩이라고 합니다.당신은 관습을 깨고 다음과 같은 것을 사용할 수 있습니다.let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue저는 무슨 일이 일어나고 있는지 이해하기 위해 이것을 지적합니다.가변 쉐이딩을 사용하는 것이 좋습니다.
기타 접근법
닐 병합
Nil 병합은 이 특정 사례에 대해 명확합니다.
var booleanValue : Bool? = false
if booleanValue ?? false {
// executes when booleanValue is true
print("optional booleanValue: '\(booleanValue)'")
}
확인 중false명확하지 않음
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
// executes when booleanValue is false
print("optional booleanValue: '\(booleanValue)'")
}
참고:if !booleanValue ?? false컴파일하지 않습니다.
강제로 래핑 해제(선택 사항)(회피)
강제로 래핑을 해제하면 나중에 누군가가 컴파일하지만 런타임에 충돌하는 변경을 수행할 가능성이 높아집니다.따라서 저는 다음과 같은 것을 피할 것입니다.
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
// executes when booleanValue is true
print("optional booleanValue: '\(booleanValue)'")
}
일반적인 접근법
이 스택 오버플로 질문은 특정한 방법을 확인하는 방법을 질문하지만,Bool?이라true이내에if문장. 참, 거짓 또는 포장되지 않은 값을 다른 식과 결합하는지 여부를 확인하는 것이 일반적인 접근 방식을 식별하는 데 도움이 됩니다.
표현이 복잡해질수록, 저는 선택적 바인딩 접근법이 다른 접근법보다 더 유연하고 이해하기 쉽다는 것을 알게 되었습니다.선택적 바인딩은 모든 선택적 유형(Int?,String?등).
var enabled: Bool? = true
if enabled == true {
print("when is defined and true at the same moment")
}
if enabled == false {
print("when is defined and false at the same moment")
}
if let enabled = enabled, enabled == true {
print("when is defined and true at the same moment")
}
if let enabled = enabled, enabled == false {
print("when is defined and false at the same moment")
}
if let enabled = enabled, enabled {
print("when is defined and true at the same moment")
}
if let enabled = enabled, !enabled {
print("when is defined and false at the same moment")
}
if enabled ?? false {
print("when is defined and true at the same moment")
}
if enabled == .some(true) {
print("when is defined and true at the same moment")
}
if enabled == (true) {
print("when is defined and true at the same moment")
}
if case .some(true) = enabled {
print("when is defined and true at the same moment")
}
if enabled == .some(false) {
print("when is defined and false at the same moment")
}
if enabled == (false) {
print("when is defined and false at the same moment")
}
if enabled == .none {
print("when is not defined")
}
if enabled == nil {
print("when is not defined")
}
저는 부울 연산자를 오버로드하는 다른 해결책을 찾았습니다.예:
public func < <T: Comparable> (left: T?, right: T) -> Bool {
if let left = left {
return left < right
}
return false
}
이것은 언어 변화의 "정신"에 완전히 부합하지는 않지만, 선택 사항의 안전한 포장 해제를 가능하게 하며, 루프 동안을 포함하여 어디서나 조건부로 사용할 수 있습니다.
제가 가장 읽기 쉬운 답은 함수를 정의하는 것입니다.그다지 복잡하지는 않지만 일을 합니다.
func isTrue(_ bool: Bool?) -> Bool {
guard let b = bool else {
return false
}
return b
}
용도:
let b: Bool? = true
if isTrue(b) {
// b exists and is true
} else {
// b does either not exist or is false
}
안토니오의 말대로
옵션은 더 이상 값이 있으면 true로, 그렇지 않으면 false로 암묵적으로 평가하지 않으므로 옵션 Bool 값으로 작업할 때 혼동을 방지합니다.대신 == 또는 != 연산자를 사용하여 0에 대해 명시적으로 확인하여 옵션에 값이 포함되어 있는지 확인합니다.
저는 우연히 발견한 코드의 한 줄을 이해하려고 몇 시간을 보냈지만, 이 스레드는 저를 올바른 방향으로 이끌었습니다.
이 인용문은 2014년 8월의 것이며, 그 이후로 애플은 다음 제안 SE-0102를 도입했고 나중에 동등, 해시 가능, 오류 및 비교 가능을 준수하도록 만들었습니다.
이제 부울이 다음인지 확인할 수 있습니다.nil사용.Never?:
var boolean: Bool? = false
boolean is Never? // false
boolean = true
boolean is Never? // false
boolean = nil
boolean is Never? // true
실제로 다음과 같은 다른 거주할 수 없는 유형을 사용할 수 있습니다.
public enum NeverEver { }
var boolean: Bool? = false
boolean is NeverEver? // false
boolean = true
boolean is NeverEver? // false
boolean = nil
boolean is NeverEver? // true
그렇긴 하지만 이제 속성 래퍼를 사용할 수도 있습니다.
@propertyWrapper struct OptionalBool {
public var wrappedValue: Bool?
public var projectedValue: Bool { wrappedValue ?? false }
public init(wrappedValue: Bool?) {
self.wrappedValue = wrappedValue
}
}
struct Struct {
@OptionalBool var predicate: Bool?
var description: String {
if $predicate {
return "predicate is true"
}
return "predicate is false"
}
}
var object = Struct()
object.description // "predicate is false"
object.predicate = false
object.description // "predicate is false"
object.predicate = true
object.description // "predicate is true"
또는 심지어:
@propertyWrapper struct OptionalBool {
var wrappedValue: Bool?
var projectedValue: OptionalBool { self }
var isNil: Bool { wrappedValue is Never? }
var value: Bool { wrappedValue ?? false }
init(wrappedValue: Bool?) {
self.wrappedValue = wrappedValue
}
}
struct Struct {
@OptionalBool var predicate: Bool?
var description: String {
if $predicate.value {
return "predicate is true"
}
if !$predicate.isNil {
return "predicate is false"
}
return "predicate is nil"
}
}
var object = Struct()
object.description // "predicate is nil"
object.predicate = false
object.description // "predicate is false"
object.predicate = true
object.description // "predicate is true"
언급URL : https://stackoverflow.com/questions/25523305/checking-the-value-of-an-optional-bool
'programing' 카테고리의 다른 글
| jQueryUniform 라이브러리를 사용하여 확인란을 선택 취소하는 방법 (0) | 2023.08.17 |
|---|---|
| dataType jsonp와 JSON의 차이 (0) | 2023.08.17 |
| IE8 및 JQuery의 트림() (0) | 2023.08.17 |
| 현재 페이지 가져오기 (0) | 2023.08.17 |
| 테이블 잠금 없이 거대한 MariaDB 프로덕션 데이터베이스에 인덱스 생성 (0) | 2023.08.17 |