为何遵循DTO协议的Exercise结构体仍报‘类型不符合协议’错误?
问题原因与解决方案
错误原因
你定义的DTO协议明确要求GetDefaultInstance()方法返回**DTO协议类型**,但Exercise结构体中实现的方法返回的是具体的Exercise类型。Swift对协议方法的签名匹配要求严格,哪怕Exercise遵循DTO,返回具体遵循类型也不满足协议的返回类型要求——协议规定的是返回DTO这个抽象协议类型,而非它的具体实现类型。
解决方案
推荐修改协议,让方法返回Self类型,这样每个遵循DTO的类型都能返回自身的默认实例,更贴合实际需求:
public protocol DTO { static func GetDefaultInstance() -> Self }
修改后,Exercise中原有的实现就完全符合协议要求了,因为Self在这里指代的就是Exercise类型。
如果暂时不能修改协议,也可以调整Exercise的实现,让返回类型严格匹配协议要求,但这种方式后续调用时需要类型转换,不够便捷:
public struct Exercise: Codable, Identifiable, DTO { public var id: String { return ExerciseId } public var ExerciseId: String public var ExerciseName: String public static func GetDefaultInstance() -> DTO { return Exercise(ExerciseId: "", ExerciseName: "") } }
内容的提问来源于stack exchange,提问作者Legion
相关产品推荐
相关产品推荐

