我曾在Xcode 6 beta 4中使用带有完成处理程序的代码,但在Xcode 6 beta 5中不再起作用。
dropsToRemove.bridgeToObjectiveC().makeObjectsPerformSelector("removeFromSuperview")
完整的方法...
func animateRemovingDrops(dropsToRemove: [UIView]) {
println(__FUNCTION__)
UIView.animateWithDuration(1.0,
animations: {
for dropView in dropsToRemove {
let x = CGFloat(UInt(arc4random_uniform(UInt32(UInt(self.gameView.bounds.size.width) * 5)))) - self.gameView.bounds.size.width * 2
let y = self.gameView.bounds.size.height
dropView.center = CGPointMake(x, -y)
}}, completion: { finished in
dropsToRemove.bridgeToObjectiveC().makeObjectsPerformSelector("removeFromSuperview")
})
}
错误是 '[UIView]' 没有名为 'bridgeToObjectiveC' 的成员
请注意,方法中的 CGFloat 和 Uint 转换是为了解决 beta 4 问题,我还没有更新该部分。该问题已在以下链接中解决: ‘CGFloat’ is not convertible to ‘UInt8' and other CGFloat issues with Swift and Xcode 6 beta 4 我认为处理完成处理程序的解决方案可能是将数组视为 NSArray,详见: What is the swift equivalent of makeObjectsPerformSelector?
(dropsToRemove as NSArray).makeObjectsPerformSelector("removeFromSuperview")
然而,假设我已经掌握了语法,只会导致另一个错误“makeObjectsPerformSelector不可用:performSelector方法不可用”。
这是一个新的Swift错误,还是我在发布说明中漏掉了什么?
dropsToRemove.map { $0.removeFromSuperview() }
非常简短。 - Brian Nickelfor drop in dropsToRemove { drop.removeFromSuperview() }
仍然比桥接代码要短得多。 - Brian NickelperformSelector
及其所有类似的方法在beta 5中已被弃用。我没有在发布说明中看到任何相关参考,但这似乎不是一个错误。 - drewag