arrays - 在 Swift 3 中扩展类型化数组(基本类型如 Bool)?

标签 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 中我得到了这个错误:

undeclared type _ArrayType


所以我尝试将其切换为 Array 并使用新关键字 Iterator

extension Array where Iterator.Element == Bool
    var allTrue : Bool{
        return !self.contains(false)
    }
}

但是我得到了一个不同的错误,提示我强制元素是非通用的

Same-type requirement makes generic parameter 'Element' non-generic


我也试过这个 2 years old post 中的解决方案但无济于事。

那么如何在 Swift 3 中扩展像 Bool 这样的基本类型数组呢?

最佳答案

只需扩展集合或序列

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 } }
}

测试 Playground :

[true, true, true, true, true, true].allTrue // true
[false, false, false, false, false, false].allFalse // true

关于arrays - 在 Swift 3 中扩展类型化数组(基本类型如 Bool)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39628695/

相关文章:

ios - SwiftUI - 使用 var 或 let 从两个文本字段添加值

ios - 如果集合中只有 1 个元素,UICollectionView 不会进入 cellForItemAt 方法

ios - 查询不工作 Firebase Swift

swift - 为什么 Swift 的运行时不能将存储的属性放入现有的结构中进行扩展?

PHP多重循环生成新数组

c - 当我只分配 [30] 时,我可以访问数组元素 [32]。(C)

php - 如何用另一个结构格式化关联数组?

c - 问题是在输入结构变量时,在某些输入后它不会打印输入语句并将输入随机分配给变量

swift - 如何在 Swift 中创建一个通用枚举 Equatable?

asp.net-mvc - TextBoxFor 中 "htmlAttributes"的类型以及如何向其添加更多属性