我正在尝试做一些逻辑上看起来像这样的事情:
if text == "" || let i = Int(text) where i < 2 {
// do something; don't care about the value of i
}
当然这不是一个有效的条件 - i
的价值如果text == ""
是持有的部分会是什么?但是,因为我只对i
子句中where
的值感兴趣,所以我希望有一种很好的方法来实现相同的效果,即如果任一条件成立,则执行相同的闭包。我目前的解决方案是提取闭包并从两个单独的if
块中调用它,但这看起来非常毛茸茸。
答案 0 :(得分:3)
与您的代码示例相同的是:
if text == "" || Int(text) ?? 2 < 2 {
print("valid")
// do your previous "something
} else {
print("invalid")
}
产生
&#34;&#34; - &GT;有效
无效
&#34; 1&#34; - &GT;有效
&#34; 2&#34; - &GT;无效
&#34; ABC&#34; - &GT;
答案 1 :(得分:3)
如果您定期进行此类比较,您可以创建自己的运算符,以便将可选项与表示成功条件的给定闭包进行比较。如果展开的值符合条件,则它将返回true - 否则为false。
例如:
infix operator ?& {precedence 130 }
func ?&<T>(lhs: T?, @noescape rhs:(T)->Bool) -> Bool {
return lhs != nil ? rhs(lhs!) : false
}
...
if text == "" || Int(text) ?& {$0 < 2} {
print("valid")
} else {
print("invalid")
}
您还可以重载现有的<
运算符来执行此操作,但这可能会影响依赖于nil
小于非可选值的现有代码。
func <<T:Comparable>(lhs: T?, rhs:T) -> Bool {
return lhs != nil ? (lhs! < rhs) : false
}
...
if text == "" || Int(text) < 2 {
print("valid")
} else {
print("invalid")
}
答案 2 :(得分:0)
也许更多&#34; Swifty&#34;处理可选值的方法是使用map
。从本质上讲,map
ping一个可选值会在闭包中为您提供一个未包装的值,然后您可以修改该值以返回您需要的值。在闭包之外,您将收到修改后的值,如果原始可选项为nil,则为nil。
let optInt: Int? = 1 // or nil
let incremented: Int? = optInt.map { $0 + 1 }
// If optInt isn't nil, its incremented value is returned by map.
// If it is nil, map just returns nil.
所以为了解决我的问题,我可以这样做:
if text == "" || Int(text).map({$0 < 2}) ?? false {
// If text has an Int value, the map closure will return
// whether that value is less than 2.
// Else, map will return nil, which we coalesce to false.
}