我在 ViewController 之间通过引用传递特定模型的数组。
如果我更改数组中特定元素的任何值,它会在所有 ViewController 中很好地反射(reflect),但是当我从该数组中删除一个元素时,它不会反射(reflect)到其他 Controller 。
remove(at: )
函数是否创建新数组并引用另一个地址?
如果是这样,如何在不更改数组地址的情况下删除元素,以便它可以在其他 View Controller 上反射(reflect)此更改?
最佳答案
Swift 数组是值类型(具体来说,数组是结构),而不是引用类型,所以当您说“在 View Controller 之间通过引用传递特定模型的数组”时,您是错误的。您只能将 Swift 数组作为值传递。
数组和其他结构一样,具有修改时复制的语义。一旦您更改数组本身,就会创建一个副本,并且对副本进行更改。
现在,在您的例子中,数组包含对模型对象的引用;当您更新模型对象时,您更改了对象本身,而不是数组中保存的引用,因此您会看到所有 View Controller 中反射(reflect)的更改。
类比可能是在街道上增加一所房子(这改变了街道本身)与改变街道上现有房屋的居住者之间的区别。
我建议您实现一个模型对象,该对象提供对底层数组的抽象,以便您拥有更好的代码并避免数组引用的问题。
一种方法可能是这样的:
struct MyModel {
let name: String
let size: Int
}
class MyData {
private var _models = [MyModel]()
var models: [MyModel] {
return _models
}
func insert(model: MyModel) {
self._models.append(model)
}
func removeModel(at: Int) {
guard at >= 0 && at < _models.count else {
return
}
self._models.remove(at: at)
}
}
虽然这并不理想,因为它仍然需要模型消费者知道底层数组中的索引。我更喜欢这样的东西:
struct MyModel: Hashable {
let name: String
let size: Int
}
class MyData {
private var _models = [MyModel]()
var models: [MyModel] {
return _models
}
func insert(model: MyModel) {
self._models.append(model)
}
func remove(model: MyModel) -> Bool {
if let index = self._models.index(of: model) {
_models.remove(at: index)
return true
} else {
return false
}
}
}
现在我不需要知道 MyData
使用什么内部集合来存储模型。
关于arrays - 数组和删除的地址(位于 :) IOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282542/