Я использую Swift 3, и я хотел бы выполнить то, что я не уверен, что это возможно. У моего бэкэнд есть несколько разных конечных точек для разных типов контента, которые отображают ответ разными способами и т. Д. Я пытаюсь создать общий протокол, который может быть реализован для каждого типа контента.Задание типа возврата для функции протокола в объявлении класса, соответствующего этому протоколу
protocol DynamicContentFetcher {
func content() -> MutableObservableArray<Any>
func getNext()
func refresh()
}
Одним из таких примеров является AdSearch.
class AdSearch: DynamicContentFetcher {
var results = MutableObservableArray<DynamicAd>([])
func content() -> MutableObservableArray<Any> {
return results
}
return
Это не компилируется с ошибкой Cannot convert return expression of type MutableObservableArray<DynamicAd> to return type 'MutableObservableArray<Any>
, который имеет смысл.
Что было бы хорошо, если бы я был мог инициализировать свои классы, соответствующие DynamicContentFetcher
как AdSearch<DynamicAd>
и использовать это значение в <> делать func content() -> MutableObservableArray<#Specified Type#>
в протоколе. Возможно ли это с Swift?
MutableObservableArray
является классом из рамки Bond, реактивного модуля программирования.
Дженерики не ковариантны в Свифт; вот откуда исходит ошибка: 'MOA' не является подтипом 'MOA '. Сделайте тип параметра явным (как показано в ответе dfri), и все это хорошо. (Сторона нет: вы выбрали плохой заголовок, это ничего не говорит нам о вашем вопросе.) –
Raphael
@Raphael Прошу прощения за титул, английский не мой первый язык, и мне было трудно описать то, что я пытался выполнить. –