Swift Extension 计算变量在协议中声明之前无法正确读取

Posted

技术标签:

【中文标题】Swift Extension 计算变量在协议中声明之前无法正确读取【英文标题】:Swift Extension computed variable not read correctly until declared in protocol 【发布时间】:2020-09-29 18:41:02 【问题描述】:

我有一个协议扩展,它声明并分配一个静态计算变量:

protocol DataType 
    

extension DataType 
    static var mocks: [Self]  [] 

然后我有另一个名为 Provider 的协议,它具有 DataType 协议的associatedtype 要求和扩展:

protocol Provider 
    associatedtype Data: DataType


extension Provider 
    static var mock: [Data] 
        Data.mocks
    

然后我创建以下符合 DataType 和 Provider 的类型:

struct Car: DataType 
    var name: String
    
    static var mocks: [Car] 
        [.init(name: "Nissan"), .init(name: "Toyota")]
    


struct CarProvider: Provider 
    typealias Data = Car


print(CarProvider.mock)

当我打印出来(一个空数组[])时,CarProvider 静态变量 mock 打印出 DataType 的 mocks 变量的默认值 - 即使Car 具有分配的数组值对于 mocks 在其结构定义中

但是,只要我将DataType 协议中的mocks 属性声明为要求,那么Carmocks 值就会被正确读取(打印正确的值:[__lldb_expr_93.Car(name: "Nissan"), __lldb_expr_93.Car(name: "Toyota")]):

protocol DataType 
    static var mocks: [Self]  get 

为什么首先在协议定义中需要属性定义?扩展值不应该足够吗?而且由于Car 结构将自己的值分配给mocks 变量,不应该读取它而不是默认扩展值吗?

【问题讨论】:

@LeoDabus 感谢您的留言。这只是为了举例,我的代码实际上并不像这样。 【参考方案1】:

为什么在协议定义中需要属性定义 第一名?扩展价值不应该足够吗?

没有。协议扩展中的实现只能被视为真正的默认实现,如果有某种方式可以在范围内覆盖它。如果没有协议中的要求,Swift 没有理由或机制去超越扩展,因为在语义上没有其他东西可以匹配。

protocol DataType  

extension DataType 
  static var mocks: [Self]  [] 


func mocks<Data: DataType>(_: Data.Type) -> [Data] 
  Data.mocks // This *is* the extension. That is the only truth.

protocol DataType 
  static var mocks: [Self]  get 


extension DataType 
  static var mocks: [Self]  [] 


func mocks<Data: DataType>(_: Data.Type) -> [Data] 
  Data.mocks // Now, we can dispatch to a concrete `Data` type!


【讨论】:

非常感谢!这真的很有帮助 +1

以上是关于Swift Extension 计算变量在协议中声明之前无法正确读取的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 协议类扩展(extension) 访问控制(fileprivate,private,internal,public,open)

swift3.0 扩展协议

学习Swift -- 拓展

swift扩展Extension_011-swift延展基本使用

Swift之协议

Swift中协议的简单介绍