首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速制作集合类(数组、字典)的浅拷贝,而不是深拷贝。

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

Stack Overflow用户
提问于 2016-02-05 11:05:45
回答 2查看 903关注 0票数 0

在这个问题上似乎有很多混乱和不同的观点,我想知道,这是否有可能在迅速地复制一个物体的浅拷贝而不是一个深拷贝。

我签了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:标志生成对结果的影响。

代码语言:javascript
运行
复制
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)

    }  

输出->

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-05 11:27:01

之所以会发生这种情况,是因为name是一个Swift字符串实例。字符串是struct,因此它是一个值类型。那是因为它总是被价值所复制。arrayObject1 as [AnyObject]是一种将字符串对象转换为快捷数组(也是一个结构)的转换。

因此,在Swift中使用此类结构(如Array和String )获取浅表副本并不容易。

我只能提出将结构实例装箱到类包装器中的想法:

代码语言:javascript
运行
复制
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()

它给了我以下输出:

代码语言:javascript
运行
复制
john
john
票数 1
EN

Stack Overflow用户

发布于 2016-02-05 11:14:35

arrayObject2[0] = "john"

这将更改数组2中0位置的项,而不是数组所在位置上已经存在的字符串的内容。要做到这一点,就需要一个可变字符串数组。

实际上,如果您用可变字符串创建数组,然后在数组2的位置0追加到字符串,您将看到数组1中的相同字符串实例也会被更新(因为它是同一个实例)。

编辑数组实例与编辑数组中的实例不同。

如果你要求的话,这份拷贝是肤浅的。从技术上讲,浅拷贝和深拷贝有时是一样的,数据类型是不可变的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35222569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档