2016-09-26 5 views
4

Intのシーケンスを受け入れる関数が必要です。ここで私が書きたいものです。タイプのシーケンスを受け入れる関数

修正し
func process(items: Sequence<Int>) { 
    items.forEach { ... } 
} 

Error: "Cannot specialize non-generic type 'Sequence'".

(と思う):

func process<S: Sequence>(items: S) where S.Iterator.Element == Int { 
    items.forEach { ... } 
} 

かなりより冗長。

私は、シーケンスプロトコルにの関連タイプがあり、Elementであることを知っています。しかし、どうしてこのような奇妙な方法でIntの要件を解決しなければならないのかよく分かりません。

最初のバージョンは動作しませんが、2番目のバージョンは何になるのでしょうか?エラーはどういう意味ですか?

+0

func process(items:Int) - >シーケンス {} –

答えて

1

ご質問はジェネリック型関連する種類の違いで行うことです。 Swiftでの目的の基本的な説明については、here( "Generic Types"、 "Associated Types"というタイトルのセクションを参照)を参照してください。シーケンスのようなプロトコルは、ジェネリックタイプではなく、関連タイプを使用します。 Sequenceがジェネリック型の具体的なクラスであれば、最初のコードサンプルが意味をなさないでしょう。この違いがエラーメッセージを説明するはずです。

なぜプロトコルではジェネリックタイプではなく関連タイプを使用するのかについては、this questionの最上位の回答を参照してください。基本的には、同じ目的を果たしているように見えますが、関連タイプはより柔軟でわかりやすいものであり、汎用タイプは実装に関するものです。これによりコードサンプルはより冗長になりますが、全体的に見れば多くのコードサンプルがよりシンプルになります。

実際にはSequence source codeから、SequenceにはIteratorProtocolプロトコルに準拠した関連タイプの反復子があります.IteratorProtocolプロトコルには独自の関連型要素(任意の型でもよい)があります。

0

なぜIntの配列を使用していませんか?

func process(items: [Int]) { 
    items.forEach { ... } 
} 
+1

「Int」のシーケンスを受け入れる必要があります。そして、私が提起した問題を理解したい。 – tombardey

+0

Intのシーケンスはどういう意味ですか? – PGDev

0

あなたはVariadic Parametersを使用することができます。

func process(items: Int...) { 
    items.forEach { (item) in 
     //do stuff with your 'item' 
    } 
} 
関連する問題