我正在使用 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>
,这是有道理的。
如果我能初始化符合AdSearch<DynamicAd>
等DynamicContentFetcher
的类,并在<>中使用该值在协议中执行func content() -> MutableObservableArray<#Specified Type#>
,那就太好了。这在 Swift 上可能吗?
MutableObservableArray
是来自 Bond 框架的一个类,一个响应式编程 pod。
协议中使用associatedtype
,并将其用作协议中content()
返回类型中的类型持有者:
struct MutableObservableArray<T> {}
protocol DynamicContentFetcher {
associatedtype T
func content() -> MutableObservableArray<T>
//func getNext()
//func refresh()
}
struct DynamicAd {}
class AdSearch: DynamicContentFetcher {
var results = MutableObservableArray<DynamicAd>()
func content() -> MutableObservableArray<DynamicAd> {
return results
}
}
如果我可以初始化符合
DynamicContentFetcher
喜欢AdSearch<DynamicAd>
并在<>
要做func content() -> MutableObservableArray<#Specified Type#>
协议。
您可能希望让 AdSeach
类是泛型的,其中包含一个泛型类型器,该泛型类型器用于指定(下面,通过推理隐式指定)DynamicContentFetcher
协议associatedtype
的typealias
。
class AdSearch<U>: DynamicContentFetcher {
// typealias T = U // infered
var results = MutableObservableArray<U>()
func content() -> MutableObservableArray<U> {
return results
}
}
struct DynamicAd {}
let dynamicAdSearch = AdSearch<DynamicAd>()