Swift 扩展可选项以检查它是nil还是false

Swift 扩展可选项以检查它是nil还是false,swift,Swift,我想扩展Optional类以返回一个Bool,指示self是nil还是false。我该怎么做 我已经有一个可选的扩展来检查它是空的还是nil,如下所示: extension Optional where Wrapped: Collection { var isNilOrEmpty: Bool { return self?.isEmpty ?? true } } 因此,它必须是沿着这些线的东西,但我无法理解。如果有疑问,请使用防护装置打开: extension O

我想扩展
Optional
类以返回一个Bool,指示
self
nil
还是
false
。我该怎么做

我已经有一个可选的扩展来检查它是空的还是
nil
,如下所示:

extension Optional where Wrapped: Collection {
    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }
}

因此,它必须是沿着这些线的东西,但我无法理解。

如果有疑问,请使用
防护装置打开:

extension Optional where Wrapped == Bool {
    var isNilOrFalse: Bool {
        guard let wrapped = self else { return true }
        return !wrapped
    }
}
可缩短为:

extension Optional where Wrapped == Bool {
    var isNilOrFalse: Bool {
        return !(self ?? false)
    }
}
但是,由于short并不总是最具可读性的,我个人会使用explicit:

extension Optional where Wrapped == Bool {
    var isNilOrFalse: Bool {
        return self == nil || self == false
    }
}
但是,我要警告不要使用这种扩展。它们不会使代码更易读。

代码>导入基础
import Foundation

extension Optional where Wrapped == String { 
    var isNotBlank: Bool {
        if let a = self, a.isNotEmpty {
            return true
        } else {
            return false
        }
    }

    var isBlank: Bool {
        return !isNotBlank
    }
}

extension Optional {
    var isNil: Bool {
        return self == nil
    }

    var isNotNil: Bool {
        return self != nil
    }

    func ifLet(_ action: (Wrapped)-> Void) {
        if self != nil {
            action(self.unsafelyUnwrapped)
        }
        else { return }
    }

    func ifNil (_ action: ()-> Void) {
        if self == nil { action() }
        else { return }
    }

    func ifElse(_ notNil: ()-> Void, _ isNil: ()-> Void) {
        if self != nil { notNil() }
        else { isNil() }
    }

    func or<T>(_ opt: T) -> T {
        if self == nil { return opt }
        else { return self as! T }
    }

    mutating func orChange<T>(_ opt: T) {
        if self == nil { self = opt as? Wrapped }
    }
}
扩展名可选,其中Wrapped==字符串{ var不是空的:Bool{ 如果让a=self,则a不为空{ 返回真值 }否则{ 返回错误 } } var为空:Bool{ 返回!不是空的 } } 扩展可选{ 变量isNil:Bool{ 返回self==nil } 变量isNotNil:Bool{ 返回自我!=零 } 函数ifLet(uAction:(已包装)->Void){ 如果self!=nil{ 行动(自我保护) } else{return} } func ifNil(u操作:()->Void){ 如果self==nil{action()} else{return} } func-ifElse(uNil:()->Void,iNil:()->Void){ 如果self!=nil{notNil()} else{isNil()} } 函数或(opt:T)->T{ 如果self==nil{return opt} else{返回self as!T} } 变异函数或更改(uopt:T){ 如果self==nil{self=opt as?Wrapped} } }
你不需要做任何新的事情。您可以使用
!=在可选布尔值上为true

var aBool: Bool? = nil

if aBool != true {
    print("aBool is nil or false")
}

这是合法和有效的。它之所以有效,是因为nil不等于true。

这不是您所要求的,但您可以简单地添加到选项bool
==true
==false
如果optionalBool==true{//do this
你想要那个扩展还是一个可选的
Bool
?请注意,这样的扩展通常是不受欢迎的,因为它们不会使你的代码变短,但会降低代码的可读性。我同意上面的评论。直接使用bools很有诱惑力(即无需与真或假进行比较)大多数情况下,您都会很好,但这也会增加出错的可能性,因为
Bool?
(与非可选状态不同)有三种可能的状态,这样的代码鼓励不处理“unset”状态。顺便说一句,即使使用可选的
Bool
,有时也不鼓励,因为它表示一个有3个值的
Bool
。有时最好只使用一个有3个值的非可选枚举。如果您发现自己需要类似
isNilOrEmpty
,则几乎肯定使用了错误的类型。如果没有区别的话如果在empty和nil之间存在差异,则此变量应该是集合中的唯一变量,而不是可选变量。Bool也是如此。如果false和nil之间没有差异,则该变量应该是Bool,而不是可选变量。
Bool?
仅应在false和nil具有不同含义的情况下使用。IMHO
return!(self==true)
更容易理解!(self??false)
@DávidPásztor我认为在这种情况下没有赢家:)