【发布时间】:2015-05-28 04:32:23
【问题描述】:
我只是这是否可能有一个对象数组MyObject,而MyObject 有一个名为isTrue 的变量,除了循环整个数组以检查该数组中的所有对象是否为真,这样做有没有短手?谢谢。
【问题讨论】:
我只是这是否可能有一个对象数组MyObject,而MyObject 有一个名为isTrue 的变量,除了循环整个数组以检查该数组中的所有对象是否为真,这样做有没有短手?谢谢。
【问题讨论】:
编辑/更新: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"
}
【讨论】:
从 Xcode 10 和 Swift 4.2 开始,您现在可以将 allSatisfy(_:) 与谓词一起使用:
let conditions = [true, true, true]
if conditions.allSatisfy({$0}) {
// Do stuff
}
【讨论】:
使用reduce函数的纯函数方式:
let boolArray = [true,true,true,true]
let isAllTrue = boolArray.reduce(true, combine: {$0 && $1}) // true
【讨论】:
2?)
let isAllTrue = boolArray.index(where: { $0 == false }) == nil。但是请注意,这将为空数组返回 true。
一个简单的方法是使用谓词:
let notAllTrue = contains(array) {
item in item.isTrue == false
}
【讨论】:
{!$0.isTrue}
试试这些。
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 } )
allSatisfy(\.isSelected)