func items<T>() -> [T]? where T : FeedItem
Это говорит о том, что вызывающий может определить T
как угодно, пока T
соответствует FeedItemModel, и эта функция вернет дополнительный массив из них.
FeedItemModel это что-то , которое соответствует FeedItem, но не обещано быть типом T
, запрошенным вызывающим.
В качестве примера рассмотрим:
class OtherModel: FeedItem {}
Согласно вашей сигнатуре функции, я могу сделать это:
let ms: [OtherModel]? = FeedModel().items()
Но тогда ваша функция не вернет мне [OtherModel]?
. Я подозреваю, что вы на самом деле не имеете в виду, что это generi c. Я ожидаю, что вы имеете в виду:
func items() -> [FeedItemModel]?
или, возможно,
func items() -> [FeedItem]?
(Хотя я бы очень хорошо подумал, прежде чем делать последнее, и убедиться, что экзистенциальный протокол действительно выполняет здесь полезную работу .)