2015-02-11 34 views
0

原代碼的iOS迅速測試1.2版本錯誤,

// add a tap gesture recognizer 
    let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:") 
    let gestureRecognizers = NSMutableArray() 
    gestureRecognizers.addObject(tapGesture) 
    if let existingGestureRecognizers = sceneView.gestureRecognizers { 
    gestureRecognizers.addObjectsFromArray(existingGestureRecognizers) 
    } 
    sceneView.gestureRecognizers = gestureRecognizers 

error -->> sceneView.gestureRecognizers = gestureRecognizers 

不幸更新的SWIFT 1.2

'NSMutableArray' is not convertible to '[AnyObject]'; did you mean to use 'as!' to force downcast? 

就是了線改爲

sceneView.gestureRecognizers = gestureRecognizers as! [AnyObject] 

後的最新版本改變接受,我現在得到這個錯誤

Cannot assign a value of type '[AnyObject]' to a value of type '[AnyObject]?' 

swift migrator沒有幫助,發行說明也沒有幫助。

這不是我的代碼,因爲我不想搞砸自己的回購,所以這是一個來自github的項目。

https://github.com/ryanshelby/Stonehenge

感謝您的幫助

+3

請問爲什麼你曾經擺在首位進入世界的NSMutableArray? – matt 2015-02-11 20:40:04

+0

最後一個錯誤令人困惑,'[AnyObject]?'的屬性應該接受'[AnyObject]'。你應該可以做一個'as?'演員。 – 2015-02-11 20:40:09

回答

5

Swift migrator在這種情況下是錯誤的。 Swift 1.2不支持從NSArray[AnyObject]的隱式投射,因此它正確地確定需要投射到[AnyObject],但它不正確地將其添加爲不安全投射,而不是安全投射。我假設不安全的轉換不是有效的代碼,並應該生成一個錯誤,但它顯示的消息是不正確的。

以下行應該得到期望的結果,但馬特是正確的,你可能要返工你的代碼以避免NSMutableArray

sceneView.gestureRecognizers = gestureRecognizers as [AnyObject] 

一個簡潔的方式來避免這將是搶原數組或創建一個新的,插入項目,並重新分配。

var gestureRecognizers = screenView.gestureRecognizers ?? [] 
gestureRecognizers.insert(tapGesture, atIndex: 0) 
screenView.gestureRecognizers = gestureRecognizers 

這就是說,UIView已經添加一個手勢識別的API:

screenView.addGestureRecognizer(tapGesture) 
+0

你的配方比我的好。 – matt 2015-02-11 22:20:06

+0

謝謝,標記爲答案。作爲一個警告,如果你運行swift的migrator並且你得到了這些錯誤,那麼在你修復代碼之前你會被徹底清理掉。遷移者甚至更改默認的AppDelegate文件。我在其他示例代碼上嘗試了它,並且它也失敗了,並且出現了像這樣的錯誤。我不會更新swift版本。 – 2015-02-11 23:45:46

3

這並不直接回答你的問題,但你的代碼是堅果入手:

let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:") 
let gestureRecognizers = NSMutableArray() 
gestureRecognizers.addObject(tapGesture) 
if let existingGestureRecognizers = sceneView.gestureRecognizers { 
    gestureRecognizers.addObjectsFromArray(existingGestureRecognizers) 
} 
sceneView.gestureRecognizers = gestureRecognizers 

你到底想幹什麼?如果你想包含這個手勢識別器的陣列,只是使它:

var gestureRecognizers = 
    [UITapGestureRecognizer(target: self, action: "handleTap:")] 

然後,如果您想要的對象追加在現有的手勢識別,只是追加他們:

gestureRecognizers.extend(existingGestureRecognizers) 

通過簡化和合理化這樣,我想你會解決你的其他困難。

+0

很酷,非常感謝。 – 2015-02-11 23:40:56