这是来自苹果的官方文档(略有修改(-
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,打印也是如此(。这次我想使用二传手而不是吸气手。怎么做?
您可以为Residence.rooms
的特定元素分配值,就像为普通Array
分配值一样。Residence
的下标方法只是使得在访问Residence.rooms
的特定元素时省略.rooms
,因此您可以简单地执行Residence[n]
来访问Residence.rooms[n]
。
因此,如果您想通过调用Residence.subscript
的 setter 为Room
赋值,您只需
john.residence?[0] = Room(name: "Bedroom")
仅当您为下标返回的值赋值时,才会调用subscript
的 setter,如上面的代码所示。
请注意,Residence
的下标方法不能防止超出范围的访问,因此无法使用下标 setter 方法向rooms
数组添加新元素。因此,例如,按照您的示例代码,如果您尝试添加第三个房间而不是通过执行john.residence?[2] = Room(name: "Bedroom")
来修改两个现有房间之一,您将收到运行时"索引超出范围"错误。