【问题标题】:Is this possible to check all value in swift array is true instead of looping one by one?这是否可以检查 swift 数组中的所有值是否为真,而不是一一循环?
【发布时间】:2015-05-28 04:32:23
【问题描述】:

我只是这是否可能有一个对象数组MyObject,而MyObject 有一个名为isTrue 的变量,除了循环整个数组以检查该数组中的所有对象是否为真,这样做有没有短手?谢谢。

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    编辑/更新:Swift 4.2 或更高版本

    Swift 4.2 引入了一个名为allSatisfy(_:)的新方法

    let bools = [true,false,true,true]
    
    if bools.allSatisfy({$0}) {
        print("all true")
    } else {
        print("contains false") // "contains false\n"
    }
    

    Swift 5.2我们也可以使用 KeyPath 属性

    class Object {
        let isTrue: Bool
        init(_ isTrue: Bool) {
            self.isTrue = isTrue
        }
    }
    
    let obj1 = Object(true)
    let obj2 = Object(false)
    let obj3 = Object(true)
    
    let objects = [obj1,obj2,obj3]
    
    if objects.allSatisfy(\.isTrue) {
        print("all true")
    } else {
        print("not all true")  // "not all true\n"
    }
    

    【讨论】:

    • boolArray 存储的是一个对象而不是纯布尔值。
    • 你知道这个和使用for循环在性能上是否有区别吗?
    • 请记住,空数组中的 allSatisfy 返回 true :)
    • 嗯,这是预期的行为,因为没有元素。如果你检查它集合不包含 false 也会发生同样的情况
    【解决方案2】:

    从 Xcode 10 和 Swift 4.2 开始,您现在可以将 allSatisfy(_:) 与谓词一起使用:

    let conditions = [true, true, true]
    if conditions.allSatisfy({$0}) {
      // Do stuff
    }
    

    【讨论】:

      【解决方案3】:

      使用reduce函数的纯函数方式:

      let boolArray = [true,true,true,true]
      let isAllTrue = boolArray.reduce(true, combine: {$0 && $1}) // true
      

      【讨论】:

      • 请记住:这不会短路。可以在第一项上找到错误,但无论如何它都会继续遍历整个列表。
      • 没错,感谢您指出这一点。因此,不鼓励在非常大的阵列上使用。
      • 有没有办法在功能上做到这一点并且仍然短路?这让我觉得这是比所选答案更好的方法,因为它更通用(即,如果您想检查所有值是否等于 2?)
      • @Kevin:短路你可以试试let isAllTrue = boolArray.index(where: { $0 == false }) == nil。但是请注意,这将为空数组返回 true。
      【解决方案4】:

      一个简单的方法是使用谓词:

      let notAllTrue = contains(array) {
          item in item.isTrue == false
      }
      

      【讨论】:

      • @LeonardoSavioDabus:不那么说教,但对程序员更友好(但仍然太多!s)
      • 你也可以使用隐式参数{!$0.isTrue}
      【解决方案5】:

      试试这些。

      1.
      
          let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
      
          if names.allSatisfy({ $0.count >= 5 }){
              print("true")
          }else{
              print("false")
          }

      2.
      
              class SelectedModel {
                  var isSelected : Bool = false
                  required init(_ isSelected: Bool) {
                      self.isSelected = isSelected
                  }
              }
              let model1 = SelectedModel(true)
              let model2 = SelectedModel(true)
              let model3 = SelectedModel(true)
              let modelArr = [model1,model2,model3]
      
              if modelArr.allSatisfy({ $0.isSelected == true }){
                   print("true")
              }else{
                   print("false")
              }

      【讨论】:

      • == true 是多余的if modelArr.allSatisfy( { $0.isSelected } )
      • 斯威夫特 5.2 allSatisfy(\.isSelected)
      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2021-03-12
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2023-04-03
      相关资源
      最近更新 更多