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具有不同含义的情况下使用。IMHOreturn!(self==true)
比更容易理解!(self??false)
@DávidPásztor我认为在这种情况下没有赢家:)