2016-10-22 10 views
0

ジェネリックコレクションを受け入れる関数があります。私はTとしてDataでこの関数を呼び出したいジェネリックコレクションを受け入れる関数にデータを渡す

func foo<T: BidirectionalCollection>(_ bar: T) 
    where T.Iterator.Element == UInt8, 
      T.SubSequence: BidirectionalCollection & RangeReplaceableCollection, 
      T.SubSequence.Iterator.Element == UInt8, 
      T.SubSequence.Index == T.Index, 
      T.SubSequence.SubSequence == T.SubSequence 
{ 
    // 
} 

foo(Data()) 

をただし、これはエラーを与える:

error: generic parameter 'T' could not be inferred

ここで何が起こっていますか? Dataインスタンスで関数を正しく呼び出すにはどうすればよいですか?

+0

私は '[UINT8]'の代わりに 'Data'のを渡す場合、それは動作します。それはどう違うの? – Etan

答えて

1

私はこの問題は、あなたの一般的な機能は、この要件を有しているData.SubSequenceは、RangeReplaceableCollectionプロトコルに準拠していないということだと思う:

T.SubSequence: BidirectionalCollection & RangeReplaceableCollection 
+0

うわー、私は、 'Data'はほんの栄光の' UInt8 'だったと思っていました。これは素早いバグか、 'データ 'の私の理解は間違っていますか? – Etan

+0

@Etan: 'Etan'は、ObjCの' NSData'の「子孫」です。詳細はhttps://github.com/apple/swift-evolution/blob/master/proposals/0069-swift-mutability-for-foundation.mdを参照してください。スウィフト3では、標準APIガイドラインに基づいてファンデーションクラスを提供するために、「NS」プレフィックスが削除されました。 – courteouselk

+0

@AntonBronnikov:これはNSプレフィックスの落としの場合ではありません(https://github.com/apple/swift-evolution/blob/master/proposals/0086-drop-foundation-ns.mdで説明されています)。 NSBundleはバンドルになります)。 'Data'は' NSData'のオーバーレイタイプで、Swiftにはまだ存在します。 –

関連する問題