2015-08-20 4 views
0

Если у вас есть функция, которая имеет общий тип, с ограничениями в протокол, вы не можете передать значение типа протокола к функции:Не удается передать протокол функционировать с стесненным общим типом

protocol P {} 

extension Int: P {} 

func testP<T: P>(value: T) {} 

// passing Int 
let val = 0 
testP(val) 

// passing Int as P (protocol) 
let valAsP: P = 0 
testP(valAsP) // error: cannot invoke 'testP' with an argument list of type '(P)' 

Если я изменю протокол на класс (и вместо этого наследую), то в обоих случаях будет выполняться одна и та же функция.

В дополнении «The Swift языке программирования» Книга говорит, что

двоеточия в декларации означает «... типа ...»

Если это верно и для общих ограничений, я бы утверждают, что это ошибка.

Так следует ли это считать ошибкой? Или есть ли случай, когда полезно иметь такое поведение?

ответ

1

Да, согласно спецификации по определению Types раздела:

Именованным является тип, который может быть дан определенным именем, когда она определена. Именованные типы включают классы, структуры, перечисления и протоколы .

протоколы действительны по именованному типу.

Также поддерживается тем фактом, что если вы удалите ограничение P с testP, код компилируется.

Вы можете решить ситуацию путем изменения подписи testP в

func testP(value: P) {} 

, который должен работать для большинства сценариев.

Кстати, ваш сценарий possible in C# где интерфейсы подобны протоколов Swift

Я создал вопрос SR-1324

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