swift - 在结构上保留值语义(包含引用类型数组)
问题描述
假设(仅作为示例)我有一个类Person和一个 struct House:
class Person {
var name: String
var lastName: String
init(name: String, lastName: String) {
self.name = name
self.lastName = lastName
}
}
struct House {
var address: String
var squareMeters: Float
var owner: Person
init(withAddress address: String, squareMeters: Float, andOwner owner: Person) {
self.address = address
self.squareMeters = squareMeters
self.owner = owner
}
}
在这种情况下,保持House的值语义非常容易,如果我没记错的话,我可以这样做:
struct House {
var address: String
var squareMeters: Float
private var owner: Person //owner is now private
init(withAddress address: String, squareMeters: Float, andOwner owner: Person) {
self.address = address
self.squareMeters = squareMeters
//init now creates a copy of the owner passed
self.owner = Person(name: owner.name, lastName: owner.lastName)
}
//every time the owner gets modified from the outside we make sure to create a copy if needed
private var ownerToWrite: Person {
mutating get {
if !isKnownUniquelyReferenced(&owner) {
owner = Person(name: owner.name, lastName: owner.lastName)
}
return owner
}
}
var ownerName: String {
get {
return owner.name
}
mutating set {
ownerToWrite.name = newValue
}
}
var ownerLastName: String {
get {
return owner.name
}
mutating set {
return ownerToWrite.lastName = newValue
}
}
}
好的,这应该工作。但是如果House包含一个Person数组呢?例如:
struct House {
var address: String
var squareMeters: Float
var tenants: [Person]
init(withAddress address: String, squareMeters: Float, andTenants tenants: [Person]) {
self.address = address
self.squareMeters = squareMeters
self.tenants = tenants
}
}
如何维护新House结构的值语义?先感谢您。
解决方案
推荐阅读
- java - 在 JSONArray 中搜索 JSON 元素
- java - ARCore - 如何仅检测单个水平面
- c# - Recurring Job and injected dependency
- javascript - 用javascript中的值返回所有深层对象的嵌套键的好方法
- rabbitmq - windows下的rabbitmq源码编译
- android - 使用 Google Daydream sdk 为联想 mirage 独奏耳机开发应用程序
- java - 如何从 Maven 存储库下载带有分类器的 JAR?
- javascript - 如何使用 ReactJs 对 Cloud Firestore 数据进行分页
- scala - gatling 的“inferHtmlResources”资源限制是什么?
- python - Flask - 单击标题后如何获取帖子的ID