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

时间:2015-09-17 09:02:09

标签: objective-c swift reference nsdictionary 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);

我得到如下输出

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";
}

意味着当我将一个字符串附加到一个实际被引入MutableDictionary的Mutable字符串时,该变化也会反映在Dictionary中。

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

var stringValue:String?
stringValue = "Hello"

var dict:Dictionary = ["name":stringValue!]
println(dict)
stringValue! += " World"
stringValue!.extend(" !!!!")
println(dict)

我在游乐场看到了这样的输出 enter image description here

我的问题是

  • 为什么更改的值不会反映在数据结构中 字典。
  • 在Swift中添加任何键值是否真的保留了值或其值 参考,如果它像目标C一样保持参考,那么这里我的错误是什么?

3 个答案:

答案 0 :(得分:4)

参考类型

不同的行为取决于在Objective-C代码中使用NSMutableString class的事实。 这意味着aMutDictaStrValueNSMutableString类型的同一对象的引用。因此,使用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"

希望这有帮助。

答案 1 :(得分:4)

Swift中的字符串(按值复制)与Objective C中的字符串完全不同(通过引用复制)。

来自Apple' Swift文档:

  

字符串是值类型

     

Swift的String类型是值类型。如果您创建一个新的String值,   将String值传递给函数或方法时复制它,   或者当它被分配给常数或变量时。在每种情况下,一个新的   创建现有String值的副本,新副本为   传递或分配,而不是原始版本。价值类型是   结构和枚举中描述的是值类型。

     

Swift的默认复制String行为确保了当一个函数   或者方法传递给你一个String值,显然你拥有它   精确的字符串值,无论它来自何处。你可以   确信您传递的字符串不会被修改,除非   你自己修改它。

     

在幕后,Swift的编译器优化了字符串的使用   实际复制仅在绝对必要时才进行。这意味着   使用字符串作为值时,总能获得出色的性能   类型。

答案 2 :(得分:2)

在swift中,String是一个Struct。 结构不是Swift中的引用类型,因此在将其设置为字典时会复制它。