我正在使用 Swift 3,我想完成一些我不确定是否可行的事情。我的后端针对不同的内容类型有几个不同的端点,这些端点以不同的方式对响应进行分页等。我正在尝试创建一个可以为每种内容类型实现的通用协议(protocol)。
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#>
在协议(protocol)中。这对 Swift 来说可能吗?
MutableObservableArray
是来自 Bond 的一个类框架,一个响应式编程 pod。
最佳答案
您可以使用 associatedtype
在您的协议(protocol)中,并将其用作 content()
的返回类型中的类型持有者在你的协议(protocol)中:
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
}
}
What would be nice, was if I could init my classes conforming to
DynamicContentFetcher
likeAdSearch<DynamicAd>
and use that value in<>
to dofunc content() -> MutableObservableArray<#Specified Type#>
in the protocol.
您可能想让 AdSeach
类是泛型的,持有一个泛型类型持有者,用于指定(在下面,隐含地通过推理)typealias
对于associatedtype
的 DynamicContentFetcher
协议(protocol)。
class AdSearch<U>: DynamicContentFetcher {
// typealias T = U // infered
var results = MutableObservableArray<U>()
func content() -> MutableObservableArray<U> {
return results
}
}
struct DynamicAd {}
let dynamicAdSearch = AdSearch<DynamicAd>()
关于ios - 在符合该协议(protocol)的类的声明中指定协议(protocol)函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609033/