2016-04-11 31 views
1

Arrayの拡張機能としてZip関数を実装しようとしています。この:swift- '[Int]'型の値を期待値型 '[_]'に変換できません

extension Array { 
    public func zip<T,U>(vals: [U]) -> [T:U] { 

     var dict: [T:U] = Dictionary() 

     for (i,key) in self.enumerate() { 
      if let k = key as? T { 
       dict[k] = vals[i] 
      } 
     } 

     return dict 
    } 
} 

let myKeys = ["a","b","c"] 
let myVars = [1,2,3] 
myKeys.zip(myVars) // ERROR: Cannot convert value of type '[Int]' to expected argument type '[_]' 

最後の行で、私は完全に理解していないエラーを取得しています:

let myKeys = ["a","b","c"] 
let myVars = [1,2,3] 
myKeys.zip(myVars) // ["a":1,"b":2,"c":3] 

は、ここに私の試みです。私はそれが[Int]を渡していることを意味し、[_]を期待していることを理解しています。しかし、ここでは一般的なプレースホルダではありませんか?なぜそれは[Int]を受け取ることに不平を言うのですか?この上の任意の考えをいただければ幸い

class func zip<T,U>(keys keys: [T], vals: [U]) -> [T:U] { 

    var dict: [T:U] = Dictionary() 

    for (i,key) in keys.enumerate() { 
     dict[key] = vals[i] 
    } 

    return dict 
} 

zip(keys: myKeys,vals: myVals) // ["a":1,"b":2,"c":3] 

:私はクラスの関数としてのzipを実装する場合

はまた、それは何の問題を持っていません!

答えて

2

Arrayには既に関連付けられたタイプがあります。Elementと呼ばれるため、Tを宣言する必要はありません。あなたのコードの問題は、実際にElementを未定義のタイプTに変換できないことです(Tと配列要素タイプの間には接続がありません)。

extension Array where Element: Hashable { 
    public func zip<U>(vals: [U]) -> [Element: U] { 

     var dict: [Element: U] = Dictionary() 

     for (i, key) in self.enumerate() { 
      dict[key] = vals[i] 
     } 

     return dict 
    } 
} 

let myKeys = ["a","b","c"] 
let myVars = [1,2,3] 
let map = myKeys.zip(myVars) 

print(map) 

また、キーにはHashableという要件が追加されています。

+0

ありがとう@Sulthan!これは意図したとおりに正確に動作します。 – OhNo

関連する問題