gpt4 book ai didi

对具有通用类型约束的 Observable 的 Swift 扩展

转载 作者:行者123 更新时间:2023-11-28 14:21:01 29 4
gpt4 key购买 nike

我正在尝试为 Observable 添加一个扩展。代码如下所示:

extension Observable where Element == ApiResponse<ItemsContainer<T>>, T:Codable

我收到以下异常:使用未声明的类型 T

显然这行不通。唯一缺少的是限制 ItemsContainer 中的泛型以符合 Codable。可能像句法问题一样简单,或者我可能只是对泛型不够好。感谢您的帮助!

编辑:给出想法 - ApiResponse 和 ItemsContainer 看起来像这样

public struct ApiResponse<ApiModel> {  
public let data: ApiModel?
}

struct ItemsContainer<Items>: Codable where Items: Codable {
let items: [Items]
}

最佳答案

问题

如果不指定通用值的模型类型,则不能将扩展限制到包含通用值的模型类型

您只能根据扩展签名上的 associatedtype 或基于泛型类型的泛型来约束协议(protocol)。因此 T 无法识别,因为没有任何协议(protocol)或通用声明它。

Ray Wenderlich Scheme

解决方案

因此请牢记我上面所说的,模型类型 需要在扩展上下文中完全定义。 但是等等这不满足我们的要求,我们希望它是通用的!

Then we do not need a Model Type, we need a protocol!

我们有两个模型类型(ApiResponseItemsContainer),我们需要知道它们的泛型类型,因此我们需要为它们分别使用两个协议(protocol)。

API响应

让我们创建一个名为 ApiResponseProtocol

public protocol ApiResponseProtocol {
associatedtype Model
var data: Model? { get }
}

很酷,associatedtype Model 将扮演我们的角色,作为对象上 ApiModel 的通用值。让我们让 ApiResponse 符合 ApiResponseProtocol

public struct ApiResponse<ApiModel>: ApiResponseProtocol {
public let data: ApiModel?
}

Generic ApiModel 这里可以定义为协议(protocol)中的Model

元素容器

ItemsContainer

的后续步骤相同
public protocol ItemsContainerProtocol {
associatedtype Item
var items: [Item] { get }
}

public struct ItemsContainer<Items>: Codable, ItemsContainerProtocol where Items: Codable {
public let items: [Items]
}

扩展

现在,由于我们可以从协议(protocol) (associatedtypes) 访问每个泛型类型,因此输出将变成如下所示:

// This would be for example ApiResponse<ItemsContainer<Model>> where Model is a Model Type conforming to Codable
extension Observable where Element: ApiResponseProtocol, Element.Model: ItemsContainerProtocol, Element.Model.Item: Codable {}

关于对具有通用类型约束的 Observable 的 Swift 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51935467/

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