【问题标题】:Extending a Generic type where T has another Generic Type扩展一个泛型类型,其中 T 具有另一个泛型类型
【发布时间】:2018-05-24 12:37:13
【问题描述】:

我有一个数据模型,用于解析来自 API 的 json。

struct APIResult<Result> {
    public let result: Result?
    ...
}

此对象接受不同的结果类型,我对其进行了扩展,因此我可以在其中包含具有不同逻辑的自定义初始化程序,这样我的 APIService 将没有任何样板代码。

这些是我所做的扩展示例,以便初始化器看起来相同

extension APIResult where Result: SomeClass  {
    init(_ json: Any, resultType: Result.Type) {
        ...
    }
}

extension APIResult where Result == SomeStruct  {
    init(_ json: Any, resultType: Result.Type) {
        ...
    }
}

// which then would look like this on the request function somewhere

request.warpResponse {
    completion(APIResult($0, resultType: UserProfile.self))
}

现在,当我尝试将 APIResult 扩展到具有自己的泛型对象的对象时遇到问题,例如 Array&lt;Element&gt;,当我尝试创建扩展时,它肯定看起来像这样

extension APIResult where Result == Array<SomeClass>  {
    init(_ json: Any, resultType: Result.Type) {
        ...
    }
}

但是当我尝试初始化时

// here's a subclass of SomeClass 
class SubClass: SomeClass { ... }

request.warpResponse {
    completion(APIResult($0, resultType: Array< SubClass >.self))
    // or
    completion(APIServiceResult($0, resultType: [SubClass].self))
}

会出现一条错误消息

无法将类型“Array.Type”的值转换为预期的参数类型“Array.Type”

或

无法将类型“[SubClass].Type”的值转换为预期的参数类型“Array.Type”

有没有办法解决这个问题?

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    您可以使用协议代替Array&lt;SomeClass&gt;,并使Array 符合该协议,以防Element 是SomeClass 类型。

    类似这样的:

    struct APIResult<Result> {
        public let result: Result?
    }
    
    protocol SomeProtocol { }
    
    class SomeClass { }
    
    class SubClass: SomeClass {   }
    
    extension APIResult where Result: SomeProtocol  {
        init(_ json: Any, resultType: Result.Type) {
            result = nil
        }
    }
    
    extension Array: SomeProtocol where Element: SomeClass {
    
    }
    
    APIResult("", resultType: Array<SubClass>.self)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多