2016-08-02 21 views
2

Intに実装されたプロトコルToStringと、ToStringという配列をとる関数があるとします。Swift:実際のタイプの配列をプロトコルタイプの配列に変換する

Intの配列をこの関数に渡そうとすると、エラーCannot convert value of type '[Int]' to expected argument type '[ToString]'が返されます。

ただし、配列にmapを使用すると関数に渡されます。これは型キャストを行うための想定された方法ですか、または配列を繰り返し処理しない方法がありますか?または、これはコンパイラによって最適化されていますか?

全例:

protocol ToString { 
    func toString() -> String 
} 

extension Int: ToString { 
    func toString() -> String { 
    return "\(self)" 
    } 
} 

func log(values: [ToString]) { 
    values.forEach { print($0.toString()) } 
} 

let values: [Int] = [1, 2, 3] 

// Error: Cannot convert value of type '[Int]' to expected argument type '[ToString]' 
log(values) 

// No error 
log(values.map { $0 }) 
+3

"[Int]型の値を期待される引数型 '[ToString]'に変換できないというエラーの原因をここで説明します:[Swiftでプロトコルを使用するときの型変換](http://stackoverflow.com/questions/38387256/type-conversion-use-protocol-in-swift) '[Int]'を '[ToString]'に変換するには、各要素の変換が必要です。 - これは部分的に重複しています。しかし、あなたは別の解決策を求めてきたので(そして、以下にあるものもあります)、私はそれを開いたままにしました。 –

答えて

3

This Q&Aは、問題を説明しています。私は、新しいアレイの作成を回避修正を提案します:あなたのlog機能は、一般的な作り、そしてToStringプロトコルに準拠するためにそれを必要とする、その型パラメータに型制約を追加します。

func log<T:ToString>(values: [T]) { 
    values.forEach { print($0.toString()) } 
} 

今スウィフトがあなたを呼び出すことができます配列要素がToStringプロトコルに準拠していれば、どのような型の配列でも使用できます。

+0

質疑応答とその答えへのリンクをありがとう。実際の問題は、私がサブプロトコルからスーパープロトコルの配列にキャストしたいということですが、実際のタイプはすべて同じではないかもしれませんが、私の質問からうまく問題を解決します。しかし、私はリンクされたQ&Aにその問題を追加すると思います。 – lassej

関連する問題