Swift GKAgentDelegate 的协议方法不对?

The protocol method of GKAgentDelegate is not right in Swift?

在GameplayKit中,我想遵循协议GKAgentDelegate,因此使用委托方法func agentDidUpdate(agent: GKAgent)

问题是,在这个方法中,参数agent被声明为GKAgent,而不是GKAgent2D,所以我无法访问agent.position,因为位置属性在GKAgent2D中,而不是GKAgent。 ..

然而在Objective-CAPI中,代理被声明为GKAgent2D。

请帮忙。

因为GKAgent2DGKAgent的子类,你可以简单地upcast它:

func agentDidUpdate(agent: GKAgent) {
    if let agent2d = agent as? GKAgent2D {
        // do thing with agent2d.position
    }
}

GKAgentDelegate 的文档(来自 Xcode 7,beta 1;即 OSX 10.11 SDK)显示两种语言的相同类型 (GKAgent):

所以它应该总是 GKAgent 在 Objective-C 下才能严格正确,但是 Objective-C 的类型安全性低于 Swift,所以你可以摆脱它(如果 GKAgent 对象曾经传递给委托方法并且您认为它是 GKAgent2D,您可能会得到 unrecognized selector 异常)。