在协议中声明之前,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 }
}