Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Swift 3中扩展类型化数组(基本类型如Bool)?_Arrays_Swift_Extension Methods_Swift3 - Fatal编程技术网

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

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

在之前的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


因此,我尝试将其切换到
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)
    }
}