你如何在Swift中复制对象?

Ant*_*ine 5 copy swift

我有以下课程:

class Client {
  let name: String
  let age: Int

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

let wrongClient = Client(name: "John", age: 9)
Run Code Online (Sandbox Code Playgroud)

如何创建wrongClient适合年龄的新版本?

我想要以下内容:

let rightClient = Client(wrongClient, age: 42)
Run Code Online (Sandbox Code Playgroud)

例如,OCaml允许开发人员执行以下操作:

type client = {
  name : string;
  age : int;
}

let wrong_client = {name = "John"; age = 25}
let right_client = {wrong_client with age = 42}
Run Code Online (Sandbox Code Playgroud)

或者在斯卡拉:

case class Client(name: String, age: Int)

val wrongClient = Client(name: "John", age: 9)
val rightClient = wrongClient.copy(age=42)
Run Code Online (Sandbox Code Playgroud)

编辑

我想尝试使用Swift进行数据不变性和数据共享.

因为不可变数据意味着从其他值"生成"值,所以"复制"对象可能经常发生.所以我的问题是:如何使用Swift轻松地从其他对象构造新对象?

编辑2

我目前正在看Swiftz的镜头.

fye*_*ell 7

您可以将 Client 实现为 astruct而不是 a class,因为struct始终按值传递。

struct Client {
    var name: String
    var age: Int

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

var wrongClient = Client(name: "John", age: 18)
var rightClient = wrongClient
rightClient.age = 99
Run Code Online (Sandbox Code Playgroud)

将错误的客户端分配给正确的客户端会创建一个副本。当你更新agerightClient的时候,wrongClient仍然是18。


Dav*_*rry 5

它没有任何定义的简写。我会推荐类似的东西:

class Client {
    let name: String
    let age: Int

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

    private init(from: Client, age:Int) {
        self.name = from.name
        self.age = age
    }

    func withAge(age:Int) -> Client {
        return Client(from: self, age: age)
    }
}

let right_client = Client(name: "John", age: 9)
let wrong_client = right_client.withAge(42)
Run Code Online (Sandbox Code Playgroud)


fre*_*138 2

您可以添加另一种init方法。

   required init(name: String, age: Int) {
       self.name = name
       self.age = age
   }

   convenience init(from: Client, withAge: Int) {
       self.init(name: from.name, age: withAge)
   }
Run Code Online (Sandbox Code Playgroud)