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

标签 arrays swift

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

相关文章:

php - array_splice() 用于关联数组

javascript - 在 Javascript 中按字符串和数字属性对 JSON 数组进行排序

PHP - 合并两个值匹配的关联数组

php - 如何在php中将字节数组转换为图像?

swift - 如何使用 NSLocalizedString 更改警报 View 中的语言

c++ - 为什么我们甚至需要 "delete[]"运算符?

ios - UITableView 中单元格之间的大间隙,iOS 错误?

android - whatsApp 发送消息让用户在 ios 中编辑消息,在 android 中它没有

ios - Swift 3 中的 UIPinchGestureRecognizer

swift - 将第三方C库导入到swift中会导致错误 "Include of non-modular header inside framework module"