Подтвердить что ты не робот

Как скопировать "Словарь" в Swift?

Как скопировать "Словарь" в Swift?

То есть, получите другой объект с одинаковыми ключами/значениями, но с другим адресом памяти.

Кроме того, как скопировать объект в Swift?

Спасибо,

4b9b3361

Ответ 1

"Словарь" на самом деле представляет собой Struct в swift, который является типом значения. Поэтому копирование выполняется так же просто, как:

let myDictionary = ...
let copyOfMyDictionary = myDictionary

Для копирования объекта (который является ссылочным типом) есть несколько разных ответов. Если объект принимает протокол NSCopying, вы можете просто сделать:

let myObject = ...
let copyOfMyObject = myObject.copy()

Если ваш объект не соответствует NSCopying, вы не сможете копировать объект. В зависимости от класса объекта он может предоставить собственный метод для получения дублированной копии или если у объекта нет внутреннего частного состояния, вы можете создать новый объект с теми же свойствами.

[Отредактировано для исправления ошибки в предыдущем ответе - NSObject (как класс, так и протокол) не предоставляет метод copy или copyWithZone и, следовательно, недостаточно для копирования объекта]

Ответ 2

Все ответы, приведенные здесь, замечательные, но они не имеют ключевого момента, предупреждающего вас о предостережениях о копировании.

В Swift у вас есть типы значений (struct, enum, tuple, array, dict и т.д.) или ссылочные типы (классы).

Если вам нужно скопировать объект класса, тогда вы должны реализовать методы copyWithZone в своем классе, а затем вызвать копию объекта.

Но если вам нужно скопировать объект типа значения, например. и Array вы можете скопировать его напрямую, просто назначив его новой переменной:

let myArray = ...
let copyOfMyArray = myArray

Но это только мелкое копирование.

Если ваш массив содержит объекты класса, и вы хотите также создать их копию, вам придется копировать каждый элемент массива отдельно. Это позволит вам сделать глубокую копию.

Это дополнительная информация, которая, как я думал, добавит к информации, уже представленной в хорошо написанных ответах выше.

Ответ 3

Объект

class Person: NSObject, NSCopying {
    var firstName: String
    var lastName: String
    var age: Int

    init(firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }

    func copyWithZone(zone: NSZone) -> AnyObject {
        let copy = Person(firstName: firstName, lastName: lastName, age: age)
        return copy
    }
}

Использование

let paul = Person(firstName: "Paul", lastName: "Hudson", age: 35)
let sophie = paul.copy() as! Person

sophie.firstName = "Sophie"
sophie.age = 5

print("\(paul.firstName) \(paul.lastName) is \(paul.age)")
print("\(sophie.firstName) \(sophie.lastName) is \(sophie.age)")

Источник: https://www.hackingwithswift.com/example-code/system/how-to-copy-objects-in-swift-using-copy