这来自苹果的官方文档(略有修改)-
class Person {
var residence: Residence?
}
class Residence {
var rooms = [Room]()
var numberOfRooms: Int {
return rooms.count
}
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
}
class Room {
let name: String
init(name: String) { self.name = name }
}
let john = Person()
let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "Living Room"))
johnsHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johnsHouse
let firstRoomName = john.residence?[0].name
print(firstRoomName)
打印-可选(“客厅”)
因此,以上程序使用getter(即使我省略了setter,也打印相同的内容)。这次我要使用setter而不是getter。怎么做呢?
最佳答案
您可以为Residence.rooms
的特定元素分配值,就像对普通Array
一样。 Residence
的下标方法仅使在访问.rooms
的特定元素时可以省略Residence.rooms
成为可能,因此您只需执行Residence[n]
即可访问Residence.rooms[n]
。
因此,如果您想通过调用Room
的setter为Residence.subscript
分配值,则只需执行以下操作
john.residence?[0] = Room(name: "Bedroom")
仅当您为下标返回的值分配一个值时,才调用
subscript
的setter,就像上面的代码一样。请注意,
Residence
的下标方法不能防止超出范围的访问,因此您不能使用下标setter方法将新元素添加到rooms
数组中。因此,例如在您的示例代码之后,如果您尝试添加第三个房间而不是通过执行john.residence?[2] = Room(name: "Bedroom")
来修改两个现有房间之一,则会收到运行时“索引超出范围”。错误。关于swift - 无法使用带有setter的自定义下标方法分配值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50762496/