以前在Swift 2.2中我能做到:
extension _ArrayType where Generator.Element == Bool{
var allTrue : Bool{
return !self.contains(false)
}
}
使用[Bool]
扩展.allTrue
。 E.g。
[true, true, false].allTrue == false
但是在Swift 3.0中我遇到了这个错误:
未声明的类型
_ArrayType
所以我尝试将其切换为Array
并使用新关键字Iterator
extension Array where Iterator.Element == Bool
var allTrue : Bool{
return !self.contains(false)
}
}
但我有一个不同的错误抱怨我强迫元素是非泛型的
相同类型的要求使通用参数'Element'非通用
我也试过这个2 years old post中的解决方案,但无济于事。
那么如何在Swift 3中扩展原始类型的数组,如Bool?
答案 0 :(得分:10)
只需扩展Collection或Sequence
extension Collection where Element == Bool {
var allTrue: Bool { return !contains(false) }
}
编辑/更新:
Xcode 10•Swift 4或更高版本
您可以使用Swift 4或更高版本的收集方法allSatisfy
let alltrue = [true, true,true, true,true, true].allSatisfy{$0} // true
let allfalse = [false, false,false, false,false, false].allSatisfy{!$0} // true
extension Collection where Element == Bool {
var allTrue: Bool { return allSatisfy{ $0 } }
var allFalse: Bool { return allSatisfy{ !$0 } }
}
测试游乐场:
[true, true, true, true, true, true].allTrue // true
[false, false, false, false, false, false].allFalse // true
答案 1 :(得分:8)
Apple在Swift 3.0(see Apple's Swift source code on GitHub)中将_ArrayType
替换为_ArrayProtocol
,因此您可以通过执行以下操作在Swift 2.2中执行相同的操作:
extension _ArrayProtocol where Iterator.Element == Bool {
var allTrue : Bool { return !self.contains(false) }
}
答案 2 :(得分:1)
从Swift 3.1(包含在Xcode 8.3中)开始,您现在可以extend a type with a concrete constraint:
extension Array where Element == Bool {
var allTrue: Bool {
return !contains(false)
}
}
您也可以扩展Collection
而不是Array
,但您需要约束Iterator.Element
,而不仅仅是Element
。
答案 3 :(得分:0)
扩展_ArrayProtocol
或Collection
对我不起作用,但Sequence
确实有效。
public extension Sequence where Iterator.Element == String
{
var allTrue: Bool { return !contains(false)
}