原始代码
// 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迁移器没有帮助,发行说明也没有。
这不是我的代码,因为我不想搞砸我自己的回购,所以这是来自github的项目。
https://github.com/ryanshelby/Stonehenge
感谢您的帮助
答案 0 :(得分:5)
在这种情况下,Swift迁移器是错误的。 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)
答案 1 :(得分: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)
通过这种方式简化和合理化,我认为你将解决其他困难。