2015-06-17 17 views
2

在GameplayKit中,我想遵守协议GKAgentDelegate,因此使用代理方法func agentDidUpdate(agent: GKAgent)GKAgentDelegate的协议方法在Swift中不正确?

问题是,在这种方法中,参数代理被声明为GKAgent,不GKAgent2D,让我无法访问agent.position,因为位置属性是GKAgent2D,不GKAgent ...

然而,在目标-C API,代理被声明为GKAgent2D。

请帮忙。

回答

2

作为GKAgent2DGKAgent一个子类,就可以简单地上溯造型它:

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

GKAgentDelegate的文档(在Xcode 7,β1;即,OSX 10.11 SDK)示出了相同类型( GKAgent)两种语言:

enter image description here

所以应该一直GKAgent为了严格正确,但是Objective-C比Swift更不安全,所以你可以避开它(如果GKAgent对象被通过,你可能会遇到unrecognized selector异常代表方法,你认为这是一个GKAgent2D)。

+0

This Works,thank you。但我仍然不明白他们为什么在Swift中将代理声明为GKAgent,但是Objective-C中的GKAgent2D .. –

+0

哦,是的,这是'GKAgent',我的不好。演示代码在执行时将其更改为' - (void)agentDidUpdate:(nonnull GKAgent2D *)agent'。 –