Como copiar ou duplicar objetos no Swift?

Mar 18 2023
Há muitas ocasiões em que você precisa fazer uma cópia de um objeto existente em outro. Por exemplo, você criaria uma cópia local de um modelo de dados existente antes de gravar nos dados de código.

Há muitas ocasiões em que você precisa transformar copyum objeto existente em outro. Por exemplo, você criaria uma cópia local de um modelo de dados existente antes de gravar nos dados de código.

Antes de discutir como criar copyum objeto no Swift, vamos primeiro explorar as diferentes técnicas disponíveis.

A linguagem de programação Swift possui dois tipos de cópia:

  1. cópia rasa
  2. Cópia Profunda

Uma cópia rasa cria um novo objeto que compartilha o mesmo endereço de memória do objeto original. Isso significa que quaisquer alterações feitas no objeto copiado também afetarão o objeto original e vice-versa. Cópias rasas podem ser criadas usando o operador de atribuição (=) em swift.

Para ilustrar isso com um exemplo, digamos que você tenha uma classe chamada Studentcom uma namepropriedade.

class Student {
    var name: String

    init(_ name: String) {
        self.name = name
    }
}

let originalStudent = Student("John")
print(originalStudent) // Output: John

let shallowCopy = originalStudent
originalStudent = "Amelia"
print(originalStudent.name) // Output: Amelia
print(shallowCopy.name) // Output: Amelia

Cópia Profunda

Uma cópia profunda cria uma nova instância do objeto e também copia todas as propriedades e subobjetos do objeto. Isso significa que o objeto copiado é completamente independente do objeto original e as alterações feitas no objeto copiado não afetarão o objeto original

Existem diferentes maneiras de criar uma cópia profunda de um objeto em que qualquer alteração no objeto original não afeta o objeto copiado e vice-versa. Eles são

1. Inicializador:

Primeiro, vamos criar uma cópia profunda de um Aluno usando seu método inicializador.

let deepCopy = Student(originalStudent.name)
originalStudent.name = "Smith"
print(originalStudent.name) // Output: Smith
print(deepCopy.name) // Output: Amelia

let originalStudent = Student("Leo")
print(originalStudent.name) // Output: Leo

let deepCopy = originalStudent.copy() as! Student
originalStudent.name = "Noah"
print(originalStudent.name) // Output: Noah
print(deepCopy.name) // Output: Leo

Codable é um protocolo que permite serializar e desserializar dados entre seus tipos Swift e formatos externos como JSON ou listas de propriedades.

Ao codificar um objeto e depois decodificá-lo em um novo objeto, você pode criar uma cópia profunda desse objeto.

Para usar Codable para copiar um objeto,

1. A aula deve estar de acordo com o Codableprotocolo. Isso requer a implementação dos métodos init(from:) e encode(to:), que lidam com a codificação e decodificação do objeto.

2. Uma vez que sua classe esteja em conformidade com Codable, você pode usar o JSONEncoderpara codificar o objeto em uma JSONrepresentação de dados. Em seguida, você pode usar o JSONDecoderpara decodificar os JSONdados de volta em uma nova instância do mesmo objeto.

Aqui está um exemplo de como usar o Codable para copiar um objeto:

struct Student: Codable {
    var name: String
}

var originalStudent = Student(_ name: "John")

let encoder = JSONEncoder()
let decoder = JSONDecoder()

do {
    let encodedData = try encoder.encode(originalStudent)
    let copiedStudent = try decoder.decode(Student.self, from: encodedData)
    originalStudent.name = "Smith"
    print(originalStudent.name) // Output: Smith
    print(copiedStudent.name) // Output: John
} catch {
    print("Error: \(error)")
}

NSObject:

Agora vamos criar uma cópia profunda de um objeto usando o copy()método fornecido pelo protocolo NSObject e NSCopying, o que nos ajuda a evitar escrever código de cópia redundante

Para criar uma cópia profunda de um objeto usando o copy()método fornecido por NSObject, nossa classe deve atender aos seguintes requisitos:

  1. A classe deve ser uma subclasse de NSObject.
  2. A classe deve estar de acordo com o protocolo NSCopying. Esta etapa não é obrigatória, mas deixa clara nossa intenção para o usuário da API.
  3. A classe deve implementar o copy(with:)método definido pelo protocolo NSCopying. Este método é responsável por criar uma nova instância do objeto e copiar os valores de todas as suas propriedades.

class Student: NSObject, NSCopying {

    var name: String

    init(_ name: String) {
        self.name = name
    }

    func copy(with zone: NSZone? = nil) -> Any {
        return Student(name)
    }
}

Conclusão:

Em resumo, uma cópia rasa cria um novo objeto que aponta para o mesmo local de memória do objeto original, enquanto uma cópia profunda cria um novo objeto com um local de memória separado do objeto original.

Usar Codable para copiar objetos em Swift é uma técnica simples e eficiente que pode economizar tempo e esforço dos desenvolvedores ao trabalhar com objetos complexos.

Espero que você tenha gostado de ler este artigo. Saúde!

# SwiftUI #S wift.org # evangelistapps

#swift #iOS #codificação #iOS16