【问题标题】:Custom swift class properties passed by reference?通过引用传递的自定义 swift 类属性?
【发布时间】:2019-05-29 15:53:22
【问题描述】:

我有一个自定义类,我为它编写了一个相等/不相等的函数测试。我正在尝试测试我修改过的对象是否等于原始对象,但是每当我修改第二个对象时,原始对象似乎也被修改了。这是一些示例代码(您可以在 Playground 中运行):

// Custom class
class MyClass {
    var foo: Bool = false

    static func ==(a: MyClass, b: MyClass) -> Bool {
       return (a.foo == b.foo)
    }
    static func !=(a: MyClass, b: MyClass) -> Bool {
        return !(a==b)
    }

    required init() {
        // do nothing
    }
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = MyClass()

tempObj = originalObj

tempObj.foo = true

print(originalObj.foo) // Output: "true" (?!?!)
print(tempObj == originalObj) // Output: "true" (?!?!)

为什么更改tempObj 的值会更改originalObj 的值,我该如何防止这种行为?

【问题讨论】:

  • tempObj = originalObj 使两个引用变量都指向内存中的同一个对象。如果您不希望两者相同,请不要这样做。
  • 类是引用类型。您可以使用结构和枚举等值类型。在这种情况下,当您编写 tempObj = originalObj 时,它实际上会复制对象,因此未来对 originalObj 的任何更改都不会修改 tempObj。

标签: swift class properties pass-by-reference


【解决方案1】:

Classes 在 Swift 中是 Reference TypesStructsValue Types。有两种方法可以实现您想要的。您可以使用struct 代替class 或为此类编写copy 方法并使用该方法。像这样的

class MyClass {
    var foo: Bool = false

    static func ==(a: MyClass, b: MyClass) -> Bool {
       return (a.foo == b.foo)
    }
    static func !=(a: MyClass, b: MyClass) -> Bool {
        return !(a==b)
    }
    required init() {
        // do nothing
    }
    func copy() -> MyClass {
        let temp = MyClass()
        temp.foo = foo
        return temp
    }
}

let originalObj: MyClass = MyClass()
var tempObj: MyClass = originalObj.copy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多