Пользовательские свойства класса swift передаются по ссылке? - PullRequest
0 голосов
/ 03 января 2019

У меня есть собственный класс, для которого я написал функциональный тест на равенство / не равен. Я пытаюсь проверить, равен ли объект, который я изменил, исходному объекту, но всякий раз, когда я изменяю второй объект, кажется, что исходный объект также изменяется. Вот пример кода (вы можете запустить его на игровой площадке):

// 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, и как я могу предотвратить это поведение?

1 Ответ

0 голосов
/ 03 января 2019

Classes в быстром Reference Types, тогда как Structs Value 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()
...