2014-07-18 35 views

risposta

54

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]

2

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

5

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.

+0

Ho chiesto di questo nella mia altra domanda ST :). – allenlinli

Problemi correlati