gpt4 book ai didi

arrays - 数组和删除的地址(位于 :) IOS

转载 作者:行者123 更新时间:2023-11-28 07:48:40 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com