gpt4 book ai didi

Swift:将泛型类型转换为协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 08:47:26 29 4
gpt4 key购买 nike

有没有办法告诉编译器泛型类型将在运行时符合特定协议(protocol)?

编译器不知道,但我知道,因此我能够避免我的库的用户必须指定符合类型。

public extension Observable {
public func cache(provider : Provider) -> Observable<E> {
return cacheInternal(provider) // error: Type 'Element' does not conform to protocol 'Mappable'
}

internal func cacheInternal<T : Mappable>(provider : Provider) -> Observable<T> {
//implementation
}

//what I want to avoid
public func cache<T : Mappable>(type: T.Type, provider : Provider) -> Observable<E> {
//implementation
}
}

而且我无法修改通用类型“Element (E)”以符合 Mappable 协议(protocol),因为 Observable 是一个我正在扩展的类。

谢谢!

最佳答案

有条件的协议(protocol)一致性可能是适合您的解决方案。

由于您的cacheInternal(provider:) 函数需要符合Mappable 协议(protocol),因此该函数应该只针对Observable 类型进行扩展> 具有符合 Mappable 的通用类型 E。这可以通过扩展声明中的 where 子句来实现:

public extension Observable where E: Mappable {
public func cache(provider : Provider) -> Observable<E> {
return cacheInternal(provider)
}

internal func cacheInternal<T: Mappable>(_ provider : Provider) -> Observable<T> {
//implementation
return Observable<T>() //added this to silence the error that nothing is returned. Don't know, what exactly you want to return
}
}

脚注:我已将代码更新为 Swift 3,以便正确测试它。 (目前无法在 2.x 上测试)我猜这只是 cacheInternal 中的 _ 隐藏了参数标签。

关于Swift:将泛型类型转换为协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34959296/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com