如何优雅地修改数组的最后一个元素?

13 浏览
0 Comments

如何优雅地修改数组的最后一个元素?

我有一个自定义类对象的数组,我需要修改最后一个元素的属性。我知道“last”和“first”被实现为getter,但这对我没有帮助:)除了通过索引访问最后一个元素之外,还有其他方法吗?\n更新\n协议DogProtocol {\n var age:Int {get set}\n}\n类Dog:DogProtocol {\n var age = 0\n}\nvar dogs = Array ()\ndogs.append(Dog())\ndogs.last?.age + = 1 //在playground中生成错误:“突变运算符的左侧不可变:\'last\'是只读属性

0
0 Comments

问题的出现原因是使用数组的`last`属性来修改最后一个元素的属性时,如果数组中的元素是值类型(value type)而不是引用类型(reference type),则无法直接修改属性。解决方法是使用协议(protocol)来限制数组中的元素类型为引用类型,然后通过协议的属性来修改最后一个元素的属性。

在这个例子中,首先展示了一个可以直接修改最后一个元素属性的最小示例。然后,作者提到了一个问题,即尝试用类似`dogs.last? = anotherDog`的方式替换最后一个元素时,会出现问题。接着,作者给出了一个更新后的解决方案,使用了一个协议来限制数组中的元素类型为引用类型,并通过协议的属性来修改最后一个元素的属性。

这个解决方案只适用于数组中的元素是引用类型的情况。如果要使用这个协议,需要为协议添加从`AnyObject`继承的限制,这样才能正常工作。

0
0 Comments

在上述内容中,作者提到了一种优雅的方法来修改数组的最后一个元素。作者通过使用arr.endIndex-1来访问数组的最后一个元素,并将其设置为新的值。这种方法可以在不改变数组长度的情况下,快速修改最后一个元素。通过这种方法,作者成功地将数组[1,2,3,4]的最后一个元素修改为5,得到了新的数组[1, 2, 3, 5]。

作者在编辑时提到了一个可能是重复问题的链接,该链接是关于在Swift中进行安全边界检查的数组查找的。作者指出,唯一的问题是如果数组为空,应用程序会崩溃。为了解决这个问题,作者提供了一个链接,该链接提供了一个安全访问数组索引的Swift扩展。最终,你仍然可以在访问最后一个元素之前使用if arr.count { }来检查数组的长度是否大于0。

作者提供了一种优雅的方法来修改数组的最后一个元素,并给出了解决空数组问题的建议。通过这种方法,我们可以快速且安全地修改数组的最后一个元素。

0
0 Comments

问题出现的原因是需要一种安全且优雅的方法来修改数组的最后一个元素。

解决方法是使用以下代码来实现:

foo.indices.last.map{ foo[$0].bar = newValue }

需要注意的是,只能在序列(例如数组)中使用这种方法,因为对于集合来说,获取最后一个索引可能需要遍历整个集合。

0