在 swift 中制作集合 类(数组、字典)的浅拷贝,而不是深拷贝。
Make a shallow copy of collection classes (Array, Dictionary) in swift, not a deep copy.
似乎对此有很多困惑和不同意见,我想知道,在 swift 中是否可以制作对象的浅拷贝而不是深拷贝。
我查看了JAVA - http://www.jusfortechies.com/java/core-java/deepcopy_and_shallowcopy.php,里面用例子清楚地解释了浅拷贝和深拷贝的区别,但是我在swift中没有找到那种例子。
我试过 initWithArray:copyItems: 来检查当我更改 copyItems 的布尔标志时它有什么不同,但我看到了 none 的不同。我应该通过更改 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)
}
输出 ->
arrayObject2[0] = "john"
这是在更改数组 2 中位置 0 的项目 - 而不是数组该位置已存在的字符串的内容。为此,它需要是一个可变字符串数组。
事实上,如果您使用可变字符串创建数组,然后附加到数组 2 中位置 0 的字符串,您将看到数组 1 中的相同字符串实例也被更新(因为它是相同的实例)。
编辑数组实例与编辑数组中的实例不同。
文案有求必应。从技术上讲,浅拷贝和深拷贝有时是同一件事,数据类型是不可变的。
这是因为 name
是一个 Swift 字符串实例。字符串是结构,因此它是一种值类型。那是因为它总是按值复制。 arrayObject1 as [AnyObject]
是对 swift 数组(也是结构)的转换,其中包含字符串对象。
所以在Swift.
中使用像数组和字符串这样的结构来获得一个浅拷贝并不是一件容易的事
我只能想出将结构实例装箱到 class 包装器中的想法:
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
似乎对此有很多困惑和不同意见,我想知道,在 swift 中是否可以制作对象的浅拷贝而不是深拷贝。
我查看了JAVA - http://www.jusfortechies.com/java/core-java/deepcopy_and_shallowcopy.php,里面用例子清楚地解释了浅拷贝和深拷贝的区别,但是我在swift中没有找到那种例子。
我试过 initWithArray:copyItems: 来检查当我更改 copyItems 的布尔标志时它有什么不同,但我看到了 none 的不同。我应该通过更改 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)
}
输出 ->
arrayObject2[0] = "john"
这是在更改数组 2 中位置 0 的项目 - 而不是数组该位置已存在的字符串的内容。为此,它需要是一个可变字符串数组。
事实上,如果您使用可变字符串创建数组,然后附加到数组 2 中位置 0 的字符串,您将看到数组 1 中的相同字符串实例也被更新(因为它是相同的实例)。
编辑数组实例与编辑数组中的实例不同。
文案有求必应。从技术上讲,浅拷贝和深拷贝有时是同一件事,数据类型是不可变的。
这是因为 name
是一个 Swift 字符串实例。字符串是结构,因此它是一种值类型。那是因为它总是按值复制。 arrayObject1 as [AnyObject]
是对 swift 数组(也是结构)的转换,其中包含字符串对象。
所以在Swift.
中使用像数组和字符串这样的结构来获得一个浅拷贝并不是一件容易的事我只能想出将结构实例装箱到 class 包装器中的想法:
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