Come copiare un "dizionario" in Swift?Come copiare un "dizionario" in Swift?
Ovvero, ottenere un altro oggetto con le stesse chiavi/valori ma un diverso indirizzo di memoria.
Inoltre, come copiare un oggetto in Swift?
Grazie,
Come copiare un "dizionario" in Swift?Come copiare un "dizionario" in Swift?
Ovvero, ottenere un altro oggetto con le stesse chiavi/valori ma un diverso indirizzo di memoria.
Inoltre, come copiare un oggetto in Swift?
Grazie,
A 'Dizionario' è in realtà uno Struct in rapida, che è un tipo di valore. Quindi copiare è facile come:
let myDictionary = ...
let copyOfMyDictionary = myDictionary
Per copiare un oggetto (che è un tipo di riferimento) ha un paio di risposte diverse. Se l'oggetto adotta il protocollo NSCopying
, allora si può solo fare:
let myObject = ...
let copyOfMyObject = myObject.copy()
Se l'oggetto non è conforme alle NSCopying
allora non sarai in grado di copiare l'oggetto. A seconda della classe dell'oggetto, può fornire il proprio metodo per ottenere una copia duplicata oppure, se l'oggetto non ha uno stato privato interno, è possibile creare un nuovo oggetto con le stesse proprietà.
[Modificato per correggere un errore nella risposta precedente - NSObject (sia della classe e del protocollo) non fornisce un metodo di copia o copyWithZone e quindi è sufficiente per poter copiare un oggetto]
oggetto
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
}
}
Uso
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)")
Fonte: https://www.hackingwithswift.com/example-code/system/how-to-copy-objects-in-swift-using-copy
Tutte le risposte qui fornite sono grandiose, ma mancano di un punto chiave che ti avvisa dei caveat di copia.
In Swift, sono disponibili tipi di valore (struct, enum, tuple, array, dict ecc.) O tipi di riferimento (classi).
Se è necessario copiare un oggetto di classe, è necessario implementare i metodi copyWithZone
nella classe e quindi chiamare la copia sull'oggetto.
Ma se è necessario copiare un oggetto di tipo valore, ad es. e Array è possibile copiare direttamente semplicemente assegnandolo ad una nuova variabile in questo modo:
let myArray = ...
let copyOfMyArray = myArray
Ma questa è solo la copia poco profonda.
Se la matrice contiene oggetti di classe e si desidera creare anche la loro copia, è necessario copiare ciascun elemento di matrice singolarmente. Ciò ti consentirà di creare una copia profonda .
Questa è un'informazione aggiuntiva, che ho pensato avrebbe aggiunto alle informazioni già presentate nelle risposte ben scritte sopra.
Ho chiesto di questo nella mia altra domanda ST :). – allenlinli