Как скопировать "Словарь" в Swift?
То есть, получите другой объект с одинаковыми ключами/значениями, но с другим адресом памяти.
Кроме того, как скопировать объект в Swift?
Спасибо,
Как скопировать "Словарь" в Swift?
То есть, получите другой объект с одинаковыми ключами/значениями, но с другим адресом памяти.
Кроме того, как скопировать объект в Swift?
Спасибо,
"Словарь" на самом деле представляет собой Struct в swift, который является типом значения. Поэтому копирование выполняется так же просто, как:
let myDictionary = ...
let copyOfMyDictionary = myDictionary
Для копирования объекта (который является ссылочным типом) есть несколько разных ответов. Если объект принимает протокол NSCopying
, вы можете просто сделать:
let myObject = ...
let copyOfMyObject = myObject.copy()
Если ваш объект не соответствует NSCopying
, вы не сможете копировать объект. В зависимости от класса объекта он может предоставить собственный метод для получения дублированной копии или если у объекта нет внутреннего частного состояния, вы можете создать новый объект с теми же свойствами.
[Отредактировано для исправления ошибки в предыдущем ответе - NSObject (как класс, так и протокол) не предоставляет метод copy или copyWithZone и, следовательно, недостаточно для копирования объекта]
Все ответы, приведенные здесь, замечательные, но они не имеют ключевого момента, предупреждающего вас о предостережениях о копировании.
В Swift у вас есть типы значений (struct, enum, tuple, array, dict и т.д.) или ссылочные типы (классы).
Если вам нужно скопировать объект класса, тогда вы должны реализовать методы copyWithZone
в своем классе, а затем вызвать копию объекта.
Но если вам нужно скопировать объект типа значения, например. и Array вы можете скопировать его напрямую, просто назначив его новой переменной:
let myArray = ...
let copyOfMyArray = myArray
Но это только мелкое копирование.
Если ваш массив содержит объекты класса, и вы хотите также создать их копию, вам придется копировать каждый элемент массива отдельно. Это позволит вам сделать глубокую копию.
Это дополнительная информация, которая, как я думал, добавит к информации, уже представленной в хорошо написанных ответах выше.
Объект
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