如何通过Protocol提取公共私有方法并保留private(set)修饰符?
解决Swift代码重复并保留
private(set)修饰符的方案 针对你遇到的Dummy和Device类存在重复updateData方法的问题,下面提供两种优雅的解决方案,同时能严格保留data字段的private(set)访问权限:
方案一:基于父类继承封装公共逻辑
如果Dummy和Device没有其他父类依赖,直接用基类封装公共逻辑是最简洁的选择:
protocol Protocolable { var data: Int { get } func update() } // 基类封装所有公共实现 class BaseProtocolable: Protocolable { private(set) var data: Int = 0 func update() { updateData() } private func updateData() { data = 100 } } // 子类只需继承基类,无需重复编写逻辑 class Dummy: BaseProtocolable {} class Device: BaseProtocolable {}
两个子类会自动继承private(set)的data属性和update方法,外部仅能读取data无法修改,完全符合需求。
方案二:内部协议+扩展(适配多继承场景)
如果子类已有其他父类受限于Swift单继承特性,可以用文件私有协议+扩展的方式提取公共逻辑:
protocol Protocolable { var data: Int { get } func update() } // 仅当前文件可见的内部协议,提供可修改data的内部接口 fileprivate protocol MutableProtocolable: Protocolable { var data: Int { get set } } // 扩展实现公共的update和updateData逻辑 extension MutableProtocolable { func update() { updateData() } private func updateData() { data = 100 } } // 子类同时遵守对外协议和内部协议,仅需定义自己的private(set) data class Dummy: Protocolable, MutableProtocolable { private(set) var data: Int = 0 } class Device: Protocolable, MutableProtocolable { private(set) var data: Int = 0 }
MutableProtocolable是文件私有,外部完全感知不到,因此外部访问子类的data时,只能看到Protocolable定义的只读属性;而内部扩展可以通过MutableProtocolable的可变接口修改data,完美隔离了内部逻辑和外部访问权限。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

