2016-09-21 4 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) 

を試してみました。

またはそれに相当する変数をdataに割り当て、selfを上記の内線番号に割り当てるにはどうすればよいですか?

+1

selfはプロトコルであるcollectionTypeなので、実際のselfの型は配列であるとは限りません。 collectionTypeには、ArrayまたはDictionary、またはCollectionTypeに準拠するその他の型を指定できます。 –

+1

'var data = self as not! 'はできません! [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配列であることを起こる場合にのみ動作しますけど。

コレクションの特定のタイプを初期化できるとは思っていません(私が知る限り)コレクションプロトコルには「必須」イニシャライザはありません。

関連する問題