swift - 如何将类对象传递给函数但防止突变?
问题描述
我看不出 Swift 语言中的什么地方可以将类对象传递给函数,但可以通过调用隐式改变对象的函数或设置公共变量来防止该函数改变对象。我正在收集这个设施根本不存在,有人可以确认吗?
也就是说,所有对象在任何可见的地方总是可变的。
解决方案
这在 Cocoa 中极为常见。您创建一个不可变类和一个可变子类。例如,请参阅 AVComposition/AVMutableComposition、CBService/CBMutableService、CNContact/CNMutableContact。
在 ObjC 中,这也是集合(数组、字典等)的常见做法,但由于这些是 Swift 中的值类型,因此无需使用类(NSArray/NSMutableArray)。
在 Swift 中,不是创建两个类,而是创建一个不可变协议和一个类:
protocol Person: AnyObject {
var name: String { get }
var address: String { get }
}
class MutablePerson: Person {
var name: String = ""
var address: String = ""
}
现在,任何接受的函数Person
都有一个不可变对象,任何接受的函数MutablePerson
都可以改变它。这是一种通用模式,可用于让程序的不同部分访问对象 API 的不同部分。它比仅仅更通用和灵活const
。
也就是说,这在 Swift 中不像在 ObjC 中那样常见,因为在大多数情况下,这很有用,类型无论如何都应该是结构。但如果需要,它绝对可用。
对于您关于使用两个类(如在 ObjC 中)执行此操作的问题,只要您在同一个文件中定义它们,这是可能的。只是有点乏味:
public class Person {
public fileprivate(set) var name: String = ""
public fileprivate(set) var address: String = ""
}
public class MutablePerson: Person {
public override var name: String {
get { super.name }
set { super.name = newValue }
}
public override var address: String {
get { super.address }
set { super.address = newValue }
}
}
属性包装器可能会改善这一点,但我无法弄清楚如何。
推荐阅读
- autodesk-forge - PixelCompare 正确校准
- r - 安装 R 包 (R 3.4.4) 时出错,已安装时要求使用此
- r - 按组pmap列以获得加权的行均值
- javascript - Vue JS - 仅检索日期
- python - Pandas 内存使用情况给出了奇怪的估计
- powershell - 如何检测为构建代理配置了代理?
- javascript - 为什么获取的数据不存储在全局变量中,以便我可以在异步函数之外使用它?
- java - 如何将多个图像与 Android Studio 中的其他请求参数一起写入 HttpUrlConnection 的 OutputStream?
- angular - 多个嵌套选项卡中的多个嵌套动态表单组
- ms-access - 根据 StartTime 和 StopTime 计算加班时间