我有以下课程:
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的镜头.
您可以将 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。
它没有任何定义的简写。我会推荐类似的东西:
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)
您可以添加另一种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)