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

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/

10-09 04:15