首页 > 解决方案 > 如何将类对象传递给函数但防止突变?

问题描述

我看不出 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 }
    }
}

属性包装器可能会改善这一点,但我无法弄清楚如何。


推荐阅读