You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:52:10