Arrays 在Swift 3中扩展类型化数组(基本类型如Bool)?
在之前的Swift 2.2中,我能够做到:Arrays 在Swift 3中扩展类型化数组(基本类型如Bool)?,arrays,swift,extension-methods,swift3,Arrays,Swift,Extension Methods,Swift3,在之前的Swift 2.2中,我能够做到: extension _ArrayType where Generator.Element == Bool{ var allTrue : Bool{ return !self.contains(false) } } 它用.allTrue扩展了[Bool]。例如 [true, true, false].allTrue == false 但在Swift 3.0中,我得到了以下错误: 未声明的类型\u ArrayType
extension _ArrayType where Generator.Element == Bool{
var allTrue : Bool{
return !self.contains(false)
}
}
它用.allTrue
扩展了[Bool]
。例如
[true, true, false].allTrue == false
但在Swift 3.0中,我得到了以下错误:
未声明的类型\u ArrayType
因此,我尝试将其切换到
Array
,并使用新的关键字Iterator
extension Array where Iterator.Element == Bool
var allTrue : Bool{
return !self.contains(false)
}
}
但我有一个不同的错误,抱怨我强迫元素非泛型
同一类型要求使泛型参数“Element”非泛型
我也尝试过这方面的解决方案,但没有效果
那么,如何扩展swift3中的Bool等基本类型的数组呢?只需扩展集合或序列即可
extension Collection where Element == Bool {
var allTrue: Bool { return !contains(false) }
}
编辑/更新: Xcode 10•Swift 4或更高版本 您可以使用Swift 4或更高版本的收集方法
测试场地:
[true, true, true, true, true, true].allTrue // true
[false, false, false, false, false, false].allFalse // true
苹果在Swift 3.0()中将
\u ArrayType
替换为\u ArrayProtocol
,因此您可以通过执行以下操作来完成与Swift 2.2相同的操作:
extension _ArrayProtocol where Iterator.Element == Bool {
var allTrue : Bool { return !self.contains(false) }
}
扩展
\u ArrayProtocol
或集合
对我不起作用,但序列
起作用
public extension Sequence where Iterator.Element == String
{
var allTrue: Bool { return !contains(false)
}
从Swift 3.1(包含在Xcode 8.3中)开始,您现在可以:
您也可以扩展
集合
而不是数组
,但是您需要约束迭代器.Element
,而不仅仅是元素
:这几乎是正确的,如果您扩展_ArrayProtocol,您需要约束它其中迭代器.Element==Bool
,谢谢您提供的信息。非常有趣。我差点忘了它是开源的。没问题,我在从Swift 2迁移到Swift 3时遇到了一个类似的问题(除了其他几个问题),我认为查看源代码不会有什么坏处@LeoDabus您是否有机会解释一下为什么需要使用where Iterator.Element==Bool
来约束\u ArrayProtocol
,而不是只使用where Element==Bool
?这对我不起作用<代码>未声明类型的使用_ArrayProtocol是。扩展集合也不起作用,但扩展序列起作用。您可以进一步将其推广到Sequence
extension _ArrayProtocol where Iterator.Element == Bool {
var allTrue : Bool { return !self.contains(false) }
}
public extension Sequence where Iterator.Element == String
{
var allTrue: Bool { return !contains(false)
}
extension Array where Element == Bool {
var allTrue: Bool {
return !contains(false)
}
}