• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Swift:在协议(protocol)一致性中覆盖来自协议(protocol)扩展的关联类型

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:44:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

所以,我正在努力实现这一目标:

有一个带有关联类型的协议(protocol),它将处理 json 解析到他的扩展中。关联类型必须符合Decodable:

protocol MyProtocol {
  associatedtype ResponseType: Decodable
  func handleResponse(data: Data) -> ResponseType
}

我想要做的是将 responseType 的默认类型设置到我的扩展中,然后,如果需要,将该类型覆盖到类或结构一致性中。像这样。

extension MyProtocol {
  typealias ResponseType = MyDefaultDecodableType

  func handleResponse(data: Data) -> ResponseType { ... }
}

class MyObject: MyProtocol {
  typealias ResponseType = AnotherDecodableType
}

问题是我在 MyObject 中遇到了这样的错误:

error: type 'MyObject' does not conform to protocol 'MyProtocol'
class MyObject: MyProtocol {
      ^
note: multiple matching types named 'ResponseType'
    associatedtype ResponseType: Decodable
                   ^
note: possibly intended match
  typealias ResponseType = AnotherDecodableType
            ^
note: possibly intended match
    public typealias ResponseType = MyDefaultDecodableType

我不知道是否有可能实现我正在尝试的目标,或者我走错了路。谁能给我点灯?

谢谢。



Best Answer-推荐答案


我创建了相同的代码。这里有一些事实需要了解。

extension MyProtocol {
    typealias ResponseType = MyDefaultDecodableType
    
    func handleResponse(data: Data) -> ResponseType {
        
        return try! JSONDecoder().decode(MyDefaultDecodableType.self, from: data)
        
    }
}

从概念上讲,Swift 中没有通用协议(protocol)。但是通过使用 typealias 我们可以为另一种类型声明一个必需的别名。

您的扩展不需要定义 typealias ResponseType = MyDefaultDecodableType,因为它会使用 MyDefaultDecodableType 提供一些默认实现,所以它没用。

所以你的扩展会是这样的

extension MyProtocol {
  //  typealias ResponseType = MyDefaultDecodableType // NO NEED FOR IT
    
    func handleResponse(data: Data) -> MyDefaultDecodableType {
        print("Test \(self)")
        return try! JSONDecoder().decode(MyDefaultDecodableType.self, from: data)
        
    }
}

现在你可以定义

class MyObject:MyProtocol {
    typealias ResponseType = AnotherDecodableType
    
    func handleResponse(data: Data) -> ResponseType {
        print("Test \(self)")

        return try! JSONDecoder().decode(AnotherDecodableType.self, from: data)
        
    }
    
}
class MyObject2:MyProtocol {
   
    
}

没有任何错误

现在如果你使用

MyObject().handleResponse(data:data)
MyObject2().handleResponse(data:data2)

你会得到

test __lldb_expr_44.MyObject

test __lldb_expr_44.MyObject2

关于ios - Swift:在协议(protocol)一致性中覆盖来自协议(protocol)扩展的关联类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48791429/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap