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
属性声明为要求,那么Car
的mocks
值就会被正确读取(打印正确的值:[__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)