2016-10-22 2 views
0

У меня есть функция, которая принимает общие коллекции.Передача данных в функцию, которая принимает общий набор

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 
{ 
    // 
} 

Я хочу, чтобы вызвать эту функцию с Data, как T:

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] 'с большим количеством функций. Является ли это ошибкой Swift или я неправильно понимаю «данные»? – Etan

+0

@Etan: 'Etan' является« потомком »« NSData »ObjC. См. Подробности: https://github.com/apple/swift-evolution/blob/master/proposals/0069-swift-mutability-for-foundation.md. Префикс 'NS' был сброшен в Swift 3 в качестве части приведения классов фундамента в соответствии со стандартными API. – courteouselk

+0

@ АнтонБронников: Это * не * случай отмены префикса NS (как описано в https://github.com/apple/swift-evolution/blob/master/proposals/0086-drop-foundation-ns.md, например . 'NSBundle' становится' Bundle'). «Данные» - это тип наложения «NSData», и оба они все еще существуют в Swift. –

Смежные вопросы