如何扩展特定的数组类型,如[Float]?

时间:2016-09-21 21:03:15

标签: swift

我已实现以下功能以向[Float]

添加功能
extension CollectionType where Generator.Element == Float, Index == Int, Index.Distance == Int {
    func sum() -> Float {
        return self.reduce(0,combine: +)
    }
    var addThem:Float {
        return self.reduce(0,combine: +)
    }
}

这似乎有效,所以我现在可以这样做

let x:[Float] = [1, 2, 3]

x.sum()         // 6
x.addThem       // 6

一切都很好。

但是当我把它添加到扩展名

 func doesSomething() {
    var data = self
    let background = [Float](count: self.count, repeatedValue: 0)
    // Compiler does not like this statement
    data = background
}

游乐场抱怨说“[Float]不能转换为Self。”

当我将代码更改为此

     let background = [Generator.Element](count: self.count, repeatedValue: 0)

Playground响应“无法调用非函数类型的值[Float.Type]。”

然后我尝试了这个

     let background:[Generator.Element] = [Float](count: self.count, repeatedValue: 0)
当我指定data = background时,

给出相同的“[Float]不可转换为Self”语法错误。

在上述扩展程序中,如何为变量[Float]data分配self或等效内容需要做什么?

1 个答案:

答案 0 :(得分:0)

如前所述,您可以这样做以使其起作用:

func doesSomething() {
    var data = self
    let background = [Float](count: self.count, repeatedValue: 0)
    // Compiler does not like this statement
    data = background as! Self
}

虽然只有在Collection恰好是Float数组时才会有效。

我不相信你能够初始化集合的特定类型,因为(据我所知)没有"必需"收集协议中的初始化者。