为何实现Identifiable协议的计算属性id会引发编译器歧义报错?
Swift中大小写差异的同名属性引发歧义的原因
我反感将“id”误用作“ID”的写法。遗憾的是,Identifiable协议要求必须硬编码名为id的成员才能遵循;不过可以使用计算属性来实现它。但这么做会引发编译器的困惑报错:
struct BMessage: Codable, Identifiable { var id: String // 为遵循Identifiable协议必须使用的“id”(我认为是ID的误写) { get { return ID // “ID的使用存在歧义” } } var ID: String = "" ... init() { ID = UUID().uuidString // “ID的使用存在歧义” } ... }
为解决这个问题,我不得不处处使用self.ID。请问这是为什么?
这是因为Swift的标识符大小写不敏感(但会保留大小写形式存储),编译器在解析名称时,会把ID和计算属性id视为同一名称的不同大小写变体,导致作用域解析冲突。
在结构体的初始化方法和计算属性的getter中,直接写ID时,编译器无法明确你要访问的是存储属性ID,还是仅大小写不同的计算属性id——Swift的名称查找机制会将这类仅大小写差异的标识符归为同一候选池,从而触发歧义报错。
显式使用self.ID时,相当于明确指定访问当前实例的存储属性ID,而非作用域内其他同名(大小写差异)的标识符,这样就能消除歧义,让编译器正确解析。
额外提醒:仅靠大小写区分属性名称的写法本身就极易混淆,即便用self解决了编译问题,也会给后续代码维护埋下隐患,建议尽量避免这种命名方式。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

