Swift:将条件和if-let与逻辑或组合

时间:2016-04-29 10:28:50

标签: ios iphone swift swift2

我正在尝试做一些逻辑上看起来像这样的事情:

if text == "" || let i = Int(text) where i < 2 {
   // do something; don't care about the value of i
}

当然这不是一个有效的条件 - i的价值如果text == ""是持有的部分会是什么?但是,因为我只对i子句中where的值感兴趣,所以我希望有一种很好的方法来实现相同的效果,即如果任一条件成立,则执行相同的闭包。我目前的解决方案是提取闭包并从两个单独的if块中调用它,但这看起来非常毛茸茸。

3 个答案:

答案 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.
}