nbu*_*urk 7 functional-programming immutability ios lenses swift
我的用例基于以下模型:
struct Person {
let name: String
let houses: [House]
}
struct House {
let owner: Person
}
Run Code Online (Sandbox Code Playgroud)
现在,理想情况下,我希望保持双向关系,要求每个房子只有一个所有者,其中所有者也应该知道其所有房屋.
使用上述数据结构,是否可以创建实例,House并且Person两者之间存在关系,并且对象基本上是相互指向的?
我猜这个的措辞已经有点误导了,因为由于structs 的值语义,它们并没有真正指向任何地方,而只是持有值的副本.看起来很明显,用双向关系创建这两个对象是不可能的,但我仍然想确定并在这里提出这个问题!
一个明显的解决方案也是使用houses和owner变量使用var而不是let在声明它们时,然后可以在每个的初始化器中维护关系struct:
struct Person {
let name: String
var houses: [House]
init(name: String, houses: [House]) {
self.name = name
self.houses = houses
self.houses = houses.map { (house: House) in
var newHouse = house
newHouse.owner = self
return newHouse
}
}
}
struct House {
var owner: Person
init(owner: Person) {
self.owner = owner
var newHouses = self.owner.houses
newHouses.append(self)
self.owner = Person(name: owner.name, houses: newHouses)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想保持houses和owner不变呢?正如我所说,似乎很明显这是不可能的,但我想知道是否有一些花哨的(可能是功能性的)方法来实现这一目标?我在考虑镜头,在处理不可变模型时可以用作吸气剂和固定器.
您所描述的内容听起来更像是 ORM,而不是语言功能,而且听起来也不适合处理结构等值类型。您如何期望语言知道这owner是 的逆关系属性houses并且需要相应地维护?这是需要用代码来强制执行的事情,仅使用 Swift 语言是不可能实现的。
听起来您正在尝试维护某种模型对象图,这是一个已经解决了很多次的问题。您应该看看Realm DB和Core Data,它们都提供托管双向关系。然而,您会发现这些都不是用结构实现的。使用值类型的问题在于它们是写时复制的。一旦你改变了对象图中的一个结构,你就需要将所有相关的东西重新分配给新的、变异的副本,然后这些副本又会发生变异,并且需要更新所有相关的结构。引用语义(类)使维护对象图变得更加容易,因为突变不会产生新实例。
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |