我有一组自定义类对象,我需要修改最后一个元素的属性。我知道"最后"和"第一"实现为getter,然而,这对我没有帮助:)除了通过索引访问最后一个元素之外还有其他方法吗?
更新
protocol DogProtocol {
var age: Int {get set}
}
class Dog: DogProtocol {
var age = 0
}
var dogs = Array<DogProtocol>()
dogs.append(Dog())
dogs.last?.age += 1 // Generates error in playground: left side of mutating operator isn't mutable: 'last" is a get-only property
答案 0 :(得分:4)
这是一个有效的最小例子。它表明您可以毫无问题地修改最后一个元素的属性。
class Dog {
var age = 0
}
let dogs = [Dog(), Dog()]
dogs.last?.age += 1 // Happy birthday!
然而,听起来你正试图用dogs.last? = anotherDog
替换最后一个元素而不是修改它。
<强>更新强>
有趣。我实际上不知道为什么协议会改变行为(我想我应该更多地研究协议),但这是一个干净的解决方案:
protocol DogProtocol {
var age: Int { get set }
}
class Dog: DogProtocol {
var age = 0
}
var dogs: [DogProtocol] = [Dog(), Dog()]
if var birthdayBoy = dogs.last {
birthdayBoy.age += 1
}
答案 1 :(得分:0)
请记住,您只能使用Sequences
(例如Array
)来做到这一点:
foo.indices.last.map{ foo[$0] = newValue }
答案 2 :(得分:-1)
我会这样做
var arr = [1,2,3,4]
arr[arr.endIndex-1] = 5
它会给你
[1, 2, 3, 5]
不过,也许这个问题是重复的
编辑:
阵列安全访问 Safe (bounds-checked) array lookup in Swift, through optional bindings?