在Swift 3中扩展类型化的数组(像Bool这样的原始类型)?

时间:2016-09-22 01:02:48

标签: arrays swift extension-methods swift3

以前在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?

4 个答案:

答案 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)

扩展_ArrayProtocolCollection对我不起作用,但Sequence确实有效。

public extension Sequence where Iterator.Element == String
{
    var allTrue: Bool { return !contains(false)
}