Swift编译报错:Type 'any ProtocolName'无法遵循ObservableObject
问题原因
当你用ProtocolName作为@ObservedObject属性的类型时,Swift会将其推断为存在类型any ProtocolName。虽然你的协议继承了ObservableObject,但存在类型本身并不直接遵循ObservableObject协议——@ObservedObject要求属性的类型是一个具体的、遵循ObservableObject的类类型,而不是抽象的存在类型。
另外你的示例代码还有个小问题:协议中不能用let声明属性,必须用var搭配访问器要求(比如var random: String { get }),因为协议只能定义属性的访问规则,不能指定存储方式。
修复方案
方案一:直接使用具体类类型
如果不需要保持抽象,直接将属性类型改为具体的ClassName即可,因为ClassName是明确遵循ObservableObject的类:
protocol ProtocolName: ObservableObject { var random: String { get } // 修正协议属性声明 } class ClassName: ProtocolName { let random: String = "示例文本" // 用let满足协议的get要求 } @ObservedObject var serviceName: ClassName = ClassName()
方案二:使用类型擦除保留抽象性
如果必须保留协议的抽象层,可以创建一个类型擦除类,将任意遵循ProtocolName的实例包装成一个具体的ObservableObject:
protocol ProtocolName: ObservableObject { var random: String { get } } class ClassName: ProtocolName { let random: String = "示例文本" } // 类型擦除包装器 class AnyProtocolName: ObservableObject, ProtocolName { var random: String { wrapped.random } private let wrapped: any ProtocolName init(_ wrapped: any ProtocolName) { self.wrapped = wrapped // 转发原实例的objectWillChange发布者 self.objectWillChange = wrapped.objectWillChange } } // 使用包装器作为属性类型 @ObservedObject var serviceName: AnyProtocolName = AnyProtocolName(ClassName())
这样既保留了协议的抽象能力,又满足了@ObservedObject对具体类型的要求。
内容的提问来源于stack exchange,提问作者stevenyuser
相关产品推荐
相关产品推荐

