这是来自苹果公司的官方文档(略有修改) -
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。怎么去呢?
答案 0 :(得分:0)
您可以为Residence.rooms
的特定元素指定一个值,就像对普通Array
一样。 Residence
的下标方法只会在访问.rooms
的特定元素时遗漏Residence.rooms
,因此您只需Residence[n]
即可访问Residence.rooms[n]
因此,如果您想通过调用Room
的设置者为Residence.subscript
分配值,则只需执行
john.residence?[0] = Room(name: "Bedroom")
只有在为上标代码返回的值赋值时才会调用subscript
的setter。就像在上面的代码中一样。
请注意Residence
的下标方法并不防止超出范围访问,因此您无法使用下标setter方法向rooms
数组添加新元素。因此,例如,如果您尝试添加第3个房间而不是通过john.residence?[2] = Room(name: "Bedroom")
修改两个现有房间中的一个,请按照示例代码进行操作,那么您将收到运行时"索引范围。" 错误。