使用contains验证多个条件(其中:)

时间:2018-02-19 09:30:55

标签: swift where

使用此代码,如果任何表单值不是nil

,我会启用一个按钮
myButton.isEnabled = !myForm.values.contains(where: { $0 == nil })

有没有办法添加多个支票?我想启用我的按钮:

  • 如果任何字段的值为nil(完成,如​​上所示);
  • 如果任何字段的值是> 0;
  • 如果任何字段的值是< 2;

(即,该值不应为零,不应超出0.0 - 2.0范围)

我还可以使用contains(where:)来做吗?

MyForm是一个像这样的词典:

 ["oct": nil, 
     "jan": Optional(3666.0), 
     "nov": nil, 
     "apr": nil, 
     "sep": nil, 
     "feb": nil, 
     "jul": nil, 
     "mar": nil, 
     "dec": nil, 
     "may": nil, 
     "jun": nil, 
     "aug": nil]

(奇怪的是,由于第三方库的行为,它接受nil值)

2 个答案:

答案 0 :(得分:1)

你可以通过过滤所有这样的值来实现:

class Offers(models.Model):
    product_id = models.CharField(max_length=10)
    original_price = models.CharField(max_length=5)
    discounted_price = models.CharField(max_length=5)
    offer_started = models.TimeField(auto_now_add=True, blank=True)
    offer_expires = ?????????
在您的情况下,

myButton.isEnabled = !myForm.values.filter { if let value = $0 { return value.field > 0.0 && value.field < 2.0 } return false }.count > 0 函数不是合适的解决方案,因为当您需要检查数组是否包含某些特定元素时,应该使用它。但在您的情况下,您需要检查值是否在特定范围内。 可以使用contains函数,但这种方法不正确

答案 1 :(得分:1)

是的,你可以。如果您想要在Double范围内至少有一个0.0..<2.0值的情况下启用此按钮,则无需致电values。您可以直接在字典上调用containswhere关键字是语法糖,使用尾随闭包语法时可以省略。

代码使用模式匹配运算符来检查范围。

myButton.isEnabled = myForm.contains { (_, value) in
    guard let value = value as? Double else { return false }
    return 0.0..<2.0 ~= value
}

如果要在给定范围内所有值为Double时启用该按钮,则必须检查已反转

myButton.isEnabled = !myForm.contains { (_, value) in
    guard let value = value as? Double else { return true }
    return !(0.0..<2.0 ~= value)
}