我先写了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)
我的问题是
答案 0 :(得分:4)
不同的行为取决于在Objective-C代码中使用NSMutableString
class
的事实。
这意味着aMutDict
和aStrValue
是对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"
希望这有帮助。
答案 1 :(得分:4)
Swift中的字符串(按值复制)与Objective C中的字符串完全不同(通过引用复制)。
来自Apple' Swift文档:
字符串是值类型
Swift的String类型是值类型。如果您创建一个新的String值, 将String值传递给函数或方法时复制它, 或者当它被分配给常数或变量时。在每种情况下,一个新的 创建现有String值的副本,新副本为 传递或分配,而不是原始版本。价值类型是 结构和枚举中描述的是值类型。
Swift的默认复制String行为确保了当一个函数 或者方法传递给你一个String值,显然你拥有它 精确的字符串值,无论它来自何处。你可以 确信您传递的字符串不会被修改,除非 你自己修改它。
在幕后,Swift的编译器优化了字符串的使用 实际复制仅在绝对必要时才进行。这意味着 使用字符串作为值时,总能获得出色的性能 类型。
答案 2 :(得分:2)
在swift中,String是一个Struct。 结构不是Swift中的引用类型,因此在将其设置为字典时会复制它。