在协议中声明之前,Swift扩展计算变量无法正确读取
我有一个协议扩展,它声明并分配一个静态计算变量:在协议中声明之前,Swift扩展计算变量无法正确读取,swift,protocols,extension-methods,protocol-extension,protocol-oriented,Swift,Protocols,Extension Methods,Protocol Extension,Protocol Oriented,我有一个协议扩展,它声明并分配一个静态计算变量: protocol DataType { } extension DataType { static var mocks: [Self] { [] } } 然后我有另一个名为Provider的协议,它具有DataType协议的associatedtype要求和扩展: protocol Provider { associatedtype Data: DataType } extension Provider {
protocol DataType {
}
extension DataType {
static var mocks: [Self] { [] }
}
然后我有另一个名为Provider的协议,它具有DataType协议的associatedtype要求和扩展:
protocol Provider {
associatedtype Data: DataType
}
extension Provider {
static var mock: [Data] {
Data.mocks
}
}
然后创建符合数据类型和提供程序的以下类型:
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打印出数据类型mocks变量的默认值-即使Car在其结构定义中为mocks分配了数组值
但是,只要我将数据类型协议中的mocks属性声明为一项要求,那么就会正确读取Car的mocks值,并打印正确的值:[[uuuulldb\uexpr\u93.Carname:Nissan,\uuulldb\uexpr\u93.Carname:Toyota]:
为什么协议定义中首先需要属性定义?扩展值是否足够?既然Car结构将自己的值分配给mocks变量,那么不应该读取该值而不是默认扩展值吗
为什么在中的协议定义中需要属性定义
第一名?扩展值是否足够
不可以。协议扩展中的实现只能被视为真正的默认实现,前提是有某种方式可以在范围中覆盖它。如果没有协议中的要求,Swift就没有理由或机制超越扩展,因为在语义上没有其他匹配的东西
协议数据类型{}
扩展数据类型{
静态变量模拟:[Self]{[]}
}
func mocks_u3;:Data.Type->[数据]{
Data.mocks//这是扩展,这是唯一的事实。
}
协议数据类型{
静态变量模拟:[Self]{get}
}
扩展数据类型{
静态变量模拟:[Self]{[]}
}
func mocks_u3;:Data.Type->[数据]{
Data.mocks//现在,我们可以分派到具体的'Data'类型!
}
@谢谢你的来信。这只是为了举例,我的代码实际上不是这样的。非常感谢!这真的很有帮助
protocol DataType {
static var mocks: [Self] { get }
}