Swift: Как я могу сделать функцию с типом возврата Подкласса соответствующим протоколу, где Суперкласс определен как тип возврата?

У меня есть протокол, где функция определена, тип возвращаемого значения функции ---- +: = 0 =: + ---- .В классе, который соответствует протоколу, я пытаюсь определить эту функцию, но с возвращаемым типом ---- +: = 1 =: + ---- .Компилятор говорит мне, что этот класс не соответствует протоколу, потому что очевидно ---- +: = 2 =: + ---- ! = ---- +: = 3 =: + ----Однако здравый смысл подсказывает мне, что ---- +: = 5 =: + ---- должна быть подходящей заменой для ---- +: = 6 =: + ---- в этом вопросе.Что я делаю неправильно?Благодарю.
4 голоса | спросил nikans 30 Jam1000000amSat, 30 Jan 2016 01:11:51 +030016 2016, 01:11:51

1 ответ


0
Прежде чем идти дальше, я бы порекомендовал некоторые справочные материалы по ковариации против контравариантности и принципу подстановки Лискова .Типы возврата для методов, переопределенных, когда подклассы являются ковариантными : переопределение метода может возвращать подтип типа возврата метода суперкласса.Параметры общего типа являются инвариантными : специализация не может ни сужать, ни расширять требования к типу.Отношения между протоколом и конкретным типом, который принимает его, больше похожи на обобщенные, чем на подклассы, поэтому типы возвращаемых данных, объявленные в протоколах, также являются инвариантными.(Трудно сказать, почему именно при первом чтении. Возможно, что-то об экзистенциальных или ограниченных протоколах?)Вы можете разрешить ковариацию в протоколе, указав соответствующие требования к типу, хотя:Теперь ясно, что тип возвращаемого значения ---- +: = 1 =: + ---- в типе, принимающем ---- +: = 2 =: + ----, должен быть либо ----+: = 3 =: + ---- или его подтип.
ответил rickster 30 Jam1000000amSat, 30 Jan 2016 01:49:15 +030016 2016, 01:49:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132