无法使用自定义下标方法使用setter分配值

时间:2018-06-08 14:08:44

标签: swift

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

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。怎么去呢?

1 个答案:

答案 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")修改两个现有房间中的一个,请按照示例代码进行操作,那么您将收到运行时"索引范围。" 错误。