首页 > 解决方案 > Swift 中的不可变引用

问题描述

我正在学习 Swift,但我找不到一种方法来实现对const.

我希望我的对象是不可变的,而不是通过let.

有没有办法在 Swift 中实现它?

标签: swiftclassconstantsimmutability

解决方案


正如其他人在评论中提到的那样,如果你想确保不变性,结构体是 Swift 的最佳选择。不管它们的属性是letor var,只要结构是按值传递的(即不是inout),就可以保证您将无法更改传递给函数的结构实例。即使你在你的函数中改变它,你也只会改变一个副本

现在,回到 C++,即使有引用,事情也可能会出错const,因为您可以轻松绕过它们。以这段代码为例:

struct Immutable {
public:
    int someIntValue = 9;
};

void doSomething(const Immutable &immutable) {
    //immutable->someIntValue = 10; // won't compile
    Immutable *mutableInstance = (Immutable *)&immutable;
    mutableInstance->someIntValue = 10;
}

int main() {
    Immutable immutable;
    printf("%d\n", immutable.someIntValue); // 9
    doSomething(immutable);
    printf("%d\n", immutable.someIntValue); // 10... hmm.. did my const reference just got mutated?
}

显然,注释掉的行不会编译,因为您将尝试更改const引用,但是一旦您转换为普通指针,您就可以根据需要更改实例。

现在,由于值与引用语义,上述构造在 Swift 中是不可能的。通过引用传递的 Struct 绝不可从调用者更改,除非调用者允许 ( inout)。

结论:在只读引用方面,Swift 有更好的机制,这些机制以值类型的形式出现。只要您使用值类型,就可以保证您拥有所需的控制权。当您开始循环引用类型时……嗯……与 C++ 中的引用类型没有太大区别。


推荐阅读