关于这个似乎有很多困惑和不同的意见,我想知道,是否有可能在 swift 中制作一个对象的浅拷贝而不是深拷贝。
我检查了 JAVA - http://www.jusfortechies.com/java/core-java/deepcopy_and_shallowcopy.php ,它用例子清楚地解释了浅拷贝和深拷贝之间的区别,但我没有在 swift 中得到那种例子。
我尝试了 initWithArray:copyItems: 来检查当我更改 copyItems 的 bool 标志时它有什么区别,但我没有看到任何区别。我应该通过更改 copyItems 标志来区分浅拷贝或深拷贝,但我错了,它总是创建深拷贝。
请检查我下面的代码,我使用 initWithArray:copyItems: 通过将 copyItems: 设置为 true 将数组对象 arrayObject1 克隆到 arrayObject2。我将 arrayObject2 第 0 个字符串对象更改为新的字符串对象,并且 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)
}
最佳答案
这是因为 name
是一个 Swift String 实例。字符串是结构,因此它是一种值类型。那是因为它总是按值复制。 arrayObject1 as [AnyObject]
是对内部包含 String 对象的 swift Array(也是结构)的转换。
因此,在 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
关于ios - 快速制作集合类(数组、字典)的浅拷贝,而不是深拷贝。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222569/