ios - 在符合该协议(protocol)的类的声明中指定协议(protocol)函数的返回类型

标签 ios swift

我正在使用 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 like AdSearch<DynamicAd> and use that value in <> to do func content() -> MutableObservableArray<#Specified Type#> in the protocol.

您可能想让 AdSeach类是泛型的,持有一个泛型类型持有者,用于指定(在下面,隐含地通过推理)typealias对于associatedtypeDynamicContentFetcher协议(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/

相关文章:

swift - Google 注销并返回登录页面

ios - 水平对齐的 UICollectionView 水平滚动

ios - 如何在 Swift 4 中验证 JSON?

ios - CLKComplicationTemplateUtilitarianSmallRingImage 不显示图像

swift - 在 iOS 中移动多个图像

ios - 使用 swift 检查从图库中选择的模式 uiimage

ios - 使用值对 NSDictionary 的 NSArray 进行排序

ios - 关于在 Swift 中比较数组值后移动索引值的问题

ios - 使用 JSONEncoder 将 nil 值编码为 null

ios - 以编程方式添加后,使用约束为 UIView 设置动画