是否可以为专用/构造的泛型类型扩展泛型类?我想用一种方法扩展Int Arrays以计算其元素的总和.
例如
extension Array<Int> {
func sum() -> Int {
return reduce(0) { $0 + $1 }
}
}
Run Code Online (Sandbox Code Playgroud) Swift操场或控制台应用程序中的以下代码:
let letters = ["A", "B", "C"]
letters.filter({
(x : String) -> Bool in
println("PRINT: \(x)")
return true
})
Run Code Online (Sandbox Code Playgroud)
打印出来:
PRINT: A
PRINT: B
PRINT: C
PRINT: A
PRINT: B
PRINT: C
Run Code Online (Sandbox Code Playgroud)
为什么它会两次迭代集合?
以前在Swift 2.2中我能做到:
extension _ArrayType where Generator.Element == Bool{
var allTrue : Bool{
return !self.contains(false)
}
}
Run Code Online (Sandbox Code Playgroud)
[Bool]随着延伸.allTrue.例如
[true, true, false].allTrue == false
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3.0中我遇到了这个错误:
未申报的类型
_ArrayType
所以我尝试将其切换为Array使用new关键字Iterator
extension Array where Iterator.Element == Bool
var allTrue : Bool{
return !self.contains(false)
}
}
Run Code Online (Sandbox Code Playgroud)
但我有一个不同的错误抱怨我强迫元素是非泛型的
相同类型的要求使通用参数'Element'非通用
我也在这个2年的帖子中尝试了解决方案,但无济于事.
那么如何在Swift 3中扩展原始类型的数组,如Bool?
所以我知道swift数组是作为struct实现的,它会自动自动复制.
我已经写了我的课MyClass,我已经实现copyWithZone了复制它
但是,我的swift数组包含我的MyClass对象,例如:
var array = [MyClass]()
当我想制作那个阵列的副本时
var anotherArray = array
它仍然没有调用MyClassObject.copyWithZone,后来如果我更改了对象属性array,anotherArray也会反映出更改.
如何在不编写for循环来迭代每个对象的情况下复制它?
它不像swift中的对象数组的深层副本那样重复,因为我不能使用struct来重写我的类.
浏览Swift的库代码我发现:
extension T! : Printable {
var description: String { get }
}
Run Code Online (Sandbox Code Playgroud)
该代码段似乎使用"description"字段扩展了所有类型.当我尝试在我的代码中执行相同的操作时,我收到错误:
example.swift:10:11:非名义类型'T!' 不能延长
protocol MyProtocol {
// ...
}
extension T! : MyProtocol { // error: Non-nominal...
// ...
}
Run Code Online (Sandbox Code Playgroud)
有类似的问题:
但他们未能解决:
extension Array {
func flatten<T>() -> T[] {
let xs = (self as Any) as Array<Array<T>>
return xs.reduce(T[](), +)
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我不确定是否需要所有这些转换。
有没有更好的办法?
为了进行比较,这里是 swift 扩展库之一中的实现。我不确定他们是否也已经弄清楚了——他们的实施始于以下评论:
// 这里还有一些工作要做