2016-09-21 57 views
0

我已經實現了以下功能添加到[浮點]如何擴展特定的數組類型,例如[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 
} 

遊樂場抱怨說,「[浮點]是無法轉換爲自我。」

當我修改代碼,這

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

遊樂場響應「不能調用非功能型[Float.Type]的價值。」當我給你data = background

然後我想這

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

可以得到相同的「[浮點]是無法轉換爲自我」語法錯誤。

我需要做些什麼來分配[Float]或等效變量data以及上述擴展中的self是什麼?

+1

因爲self只是一個collectionType,它是一個協議,所以self的實際類型不能保證是一個Array。一個collectionType可以是Array或者Dictionary或者任何符合CollectionType的其他類型。 –

+1

難道你不能'var data = self as! [Float]' – Santosh

+0

http://stackoverflow.com/a/28288619/2303865 –

回答

0

正如前面提到的,你可以做到這一點,以排序得到它的工作:

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

雖然若集合恰好是一個float數組,這隻會工作。

我不相信你能夠初始化集合的具體類型,因爲(據我所知)在收集協議中沒有「必需」初始化符。