【问题标题】:iOS Swift - Modifying one array modifies anotheriOS Swift - 修改一个数组会修改另一个数组
【发布时间】:2017-04-26 20:43:08
【问题描述】:

我有一个方法可以执行以下操作:

let object = sportsArray[0]
let newObject = object
newObject.items?.removeAll()

当我这样做时,'newObject''items' 数组现在是空的,这正是我想要的,但它也清空了 'object' 中的 'items' 数组。我在这里做错了什么?我该如何防止这种情况发生。我想在不影响原始对象的情况下对 newObject 进行更改。任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 对象的类型是什么?它是一个类还是一个结构?结构可以隐式复制,而类需要显式复制.copy()(如果它符合NSCopying ofc)。
  • 检查 stackoverflow.com/questions/27812433/… 以获取 Array 的扩展,该扩展对继承自 Copying 协议的对象进行深拷贝。

标签: ios arrays swift


【解决方案1】:

sportsArray[0]objectnewObject 都是对相同类实例的引用。当您使用任何引用更改该实例时,其他引用将反映该更改,因为它们引用同一事物。

您需要使用初始化程序或.copy 显式创建对象的新实例。

【讨论】:

    【解决方案2】:

    你可以试试这个,显然你需要将ClassName替换成真实的类名

    let newObject = ClassName(object)
    

    如果你的类实现了NSCopy,你也可以使用object.copy()

    看看如何在此处定义采用一个参数的新初始化: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html

    【讨论】:

    • 这个好像不行。 "参数传递给不带参数的调用"
    • 您必须创建一个新的初始化函数,该函数采用相同的参数来解决编译错误或实现 NSCopy
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多