在符合该协议的类的声明中指定协议函数的返回类型

  • 本文关键字:协议 返回类型 函数 声明 ios swift
  • 更新时间 :
  • 英文 :


我正在使用 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协议associatedtypetypealias

class AdSearch<U>: DynamicContentFetcher {
    // typealias T = U // infered
    var results = MutableObservableArray<U>()
    func content() -> MutableObservableArray<U> {
        return results
    }
}
struct DynamicAd {}
let dynamicAdSearch = AdSearch<DynamicAd>()

最新更新