实例引用真的可以在Swift中使用吗?

Mru*_*rug 5 reference objective-c nsdictionary swift swift-playground

我首先编写了Objective-C代码

NSMutableString *aStrValue = [NSMutableString stringWithString:@"Hello"];
NSMutableDictionary *aMutDict = [NSMutableDictionary dictionary];
[aMutDict setObject:aStrValue forKey:@"name"];

NSLog(@"Before %@",aMutDict);
[aStrValue appendString:@" World"];
NSLog(@"After %@",aMutDict);
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下

2015-09-17 14:27:21.052 ShareIt[4946:129853] Before {
    name = Hello;
}
2015-09-17 14:27:21.057 ShareIt[4946:129853] After {
    name = "Hello World";
}
Run Code Online (Sandbox Code Playgroud)

意味着当我将一个字符串附加到Mutable字符串(实际上被称为MutableDictionary)时,该更改也会反映在Dictionary中.

但后来我在Swift尝试了同样的东西

var stringValue:String?
stringValue = "Hello"

var dict:Dictionary = ["name":stringValue!]
println(dict)
stringValue! += " World"
stringValue!.extend(" !!!!")
println(dict)
Run Code Online (Sandbox Code Playgroud)

我在游乐场看到了这样的输出 在此输入图像描述

我的问题是

  • 为什么更改的值不会反映在像Dictionary这样的数据结构中.
  • 在Swift中添加任何键值是否真的保留了值或其引用,如果它保持像Objective-C那样的引用那么这里是我的错误?

Luc*_*tti 4

参考类型

不同的行为取决于您在 Objective-C 代码中使用NSMutableStringclass. 这意味着 和aMutDictaStrValue同一类型对象的引用NSMutableString。因此,您应用的更改aStrValue可以通过 看到aMutDict

值类型

另一方面,在 Swift 中,您正在使用String struct. 这是一个值类型。这意味着当您将值从一个变量复制到另一个变量时,使用第一个变量所做的更改对第二个变量不可见。

以下示例清楚地描述了该value type行为:

var word0 = "Hello"
var word1 = word0

word0 += " world" // this will NOT impact word1

word0 // "Hello world"
word1 // "Hello"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • @user2864740:怎么样?appzYourLife 的答案是绝对正确的。 (3认同)
  • @user2864740:两个示例(“Objective-C”和“Swift”)都位于**可变上下文**中。事实上,OP 使用“NSMutableString”、“NSMutableDictionary”、“var String”和“var Dictionary”(所有“mutables”)。这里真正的区别是“NSMutableString”是一个对象(**引用类型**),而“String”是一个结构体(**值类型**)。所以这里我们讨论的是“引用类型”和“值类型”,**不是可变性**。 (2认同)