在这个问题上似乎有很多混乱和不同的观点,我想知道,这是否有可能在迅速地复制一个物体的浅拷贝而不是一个深拷贝。
我签了Java-shallowcopy.php,用示例清楚地解释了浅拷贝和深拷贝之间的区别,但是我没有得到一个快速的例子。
我尝试了initWithArray: copyItems :来检查当我更改copyItems的布尔标志时,它会产生什么不同,但是没有看到任何不同。我应该通过更改copyItems标志来区别浅拷贝或深拷贝,但是我错了,它总是创建一个深拷贝。
请检查下面的代码,我使用initWithArray:copyItems:通过将arrayObject1 : true设置为copyItems:将数组对象copyItems克隆到arrayObject2。我将arrayObject2第0字符串对象更改为新的string对象,arrayObject2第0对象更改,但arrayObject1第0对象没有更改。然而,如果我通过将copyItems:赋值为false来复制它,那么我的结果也是相同的。
那么,如何实现浅拷贝,如果不是通过initWithArray:copyItems:那么copyItems:标志生成对结果的影响。
func createAnArrayUsingArrayCopyItems(){
let name = "albort"
let arrayObject1 = NSArray.init(objects: name, 15)
let arrayObject2 = NSMutableArray.init(array: arrayObject1 as [AnyObject], copyItems: true)
arrayObject2[0] = "john"
print(arrayObject1)
print(arrayObject2)
} 输出->

发布于 2016-02-05 11:27:01
之所以会发生这种情况,是因为name是一个Swift字符串实例。字符串是struct,因此它是一个值类型。那是因为它总是被价值所复制。arrayObject1 as [AnyObject]是一种将字符串对象转换为快捷数组(也是一个结构)的转换。
因此,在Swift中使用此类结构(如Array和String )获取浅表副本并不容易。
我只能提出将结构实例装箱到类包装器中的想法:
class StringBox : CustomStringConvertible, NSCopying {
var string: String
init(str: String) {
string = str
}
var description: String {
return "\(string)"
}
@objc func copyWithZone(zone: NSZone) -> AnyObject {
return StringBox(str: string)
}
}
func createAnArrayUsingArrayCopyItems(){
let name = StringBox(str: "albort")
let arrayObject1 = NSArray.init(objects: name, 15)
let arrayObject2 = NSMutableArray.init(array: arrayObject1 as [AnyObject], copyItems: false)
(arrayObject2[0] as! StringBox).string = "john"
print(arrayObject1[0])
print(arrayObject2[0])
}
createAnArrayUsingArrayCopyItems()它给了我以下输出:
john
john发布于 2016-02-05 11:14:35
arrayObject2[0] = "john"
这将更改数组2中0位置的项,而不是数组所在位置上已经存在的字符串的内容。要做到这一点,就需要一个可变字符串数组。
实际上,如果您用可变字符串创建数组,然后在数组2的位置0追加到字符串,您将看到数组1中的相同字符串实例也会被更新(因为它是同一个实例)。
编辑数组实例与编辑数组中的实例不同。
如果你要求的话,这份拷贝是肤浅的。从技术上讲,浅拷贝和深拷贝有时是一样的,数据类型是不可变的。
https://stackoverflow.com/questions/35222569
复制相似问题