iOS swift测试1.2版错误,

时间:2015-02-11 20:31:24

标签: ios swift

原始代码

  // 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

感谢您的帮助

2 个答案:

答案 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)

通过这种方式简化和合理化,我认为你将解决其他困难。