ios - 快速制作集合类(数组、字典)的浅拷贝,而不是深拷贝。

标签 ios arrays swift deep-copy shallow-copy

关于这个似乎有很多困惑和不同的意见,我想知道,是否有可能在 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)

    }  

输出->
enter image description here

最佳答案

这是因为 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/

相关文章:

iOS 共享扩展 kUTTypeMovie 获取缩略图

ios - 更改 UIProgressbar 的高度并给出边界和角半径

ios - 当应用程序进入后台时,如何在 SpriteKit 中正确暂停?

php - 使用事件记录形成查询

python - 如何加快 python 中的数组生成速度?

java - 将数组从类中分离出来

ios - SceneKit:相对于 body 的物理世界

ios - 获取firebase服务器时间云函数

ios - PageViewController - 将变量传递给 subview

ios - 如何设置加载 uicollectionview 时选择的项目?