2015-06-17 57 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'。 –