Swift类遵循Identifiable无需id而结构体需实现id的理解是否正确
解答
你的理解完全正确,该编译表现差异由Swift标准库中Identifiable协议针对不同类型的默认实现规则导致:
- 针对结构体、枚举等值类型:标准库没有提供
Identifiable协议的默认适配,必须显式实现协议要求的全局唯一id属性才能满足合规要求,否则就会触发你看到的Type 'Bar' does not conform to protocol 'Identifiable'编译错误。 - 针对类等引用类型:标准库为所有
AnyObject类型(也就是所有Swift类)提供了Identifiable的默认扩展实现,该实现直接将实例的内存地址标识(ObjectIdentifier)作为id值,天然具备全局唯一性,因此不需要手动实现id属性即可符合协议要求,这就是Foo类无编译报错的原因。
对应复现代码如下:
struct Bar: Identifiable { // 编译报错:Type 'Bar' does not conform to protocol 'Identifiable' // 修复方案:显式添加唯一id属性,例如 let id = UUID() } class Foo: Identifiable { // 无编译报错,默认使用实例内存地址作为唯一id }
补充说明:如果类中手动实现了
id属性,会覆盖标准库提供的默认实现,业务逻辑中读取到的id会以自定义实现为准。
内容的提问来源于stack exchange,提问作者Mary Doe
相关产品推荐
相关产品推荐

