如何在swift可选中比较值

jja*_*eko 4 optional swift

var someString: String? = "a"    
someString = "b" 
// or someString = nil
Run Code Online (Sandbox Code Playgroud)

条件: someString不是nil和"a"

例:

if someString != nil && someString != "a" {

}
Run Code Online (Sandbox Code Playgroud)

是否可以调整一个?

lkr*_*der 7

Swift 3中的正确方法是使用多子句条件:

if let bString = someString, bString != "a" {
    print("bString: '\(bString)' is not nil and is different from 'a'")
}
Run Code Online (Sandbox Code Playgroud)

https://github.com/apple/swift-evolution/blob/master/proposals/0099-conditionclauses.md


Ant*_*nio 3

我认为您的意思是您想在单个逻辑表达式中测试someString != nil and (而不是在 and 中测试两个)。 someString != "a"

不,我认为使用内置运算符不可能做到这一点,但可以实现如下所示的字符串扩展:

extension String {
    func isDifferentThan(value: String?) -> Bool {
        return value != nil && self != value?
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以使用如下:

someString = nil
"a".isDifferentThan(someString) // Return false

someString = "b"
"a".isDifferentThan(someString) // Return true

someString = "a"
"a".isDifferentThan(someString) // Return false
Run Code Online (Sandbox Code Playgroud)

附录:一个更优雅的解决方案是定义您自己的逻辑运算符。我已经使用过!~=,但请随意使用您自己的。

infix operator !~= { associativity left }
func !~= (a: String?, b: String?) -> Bool {
    if a == nil || b == nil {
        return false
    }

    return a != b
}
Run Code Online (Sandbox Code Playgroud)

测试如下:

someString = nil
someString !~= "a" // Returns false

someString = "b"
someString !~= "a" // Returns true

someString = "a"
someString !~= "a" // Returns false

someString = nil
someString !~= nil // Returns false
Run Code Online (Sandbox Code Playgroud)

您可以在处理值时对其进行微调nil(例如添加对havingnil和returning的检查true,以防您希望条件“两边都是nil”评估为true)