不能使用带有资源库的自定义下标方法赋值



这是来自苹果的官方文档(略有修改(-

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")来修改两个现有房间之一,您将收到运行时"索引超出范围"错误。

最新更新