【发布时间】:2014-08-04 19:33:27
【问题描述】:
我的这段代码带有一个在 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() }很短。 -
@BrianNickel,使用 map 产生副作用是一个危险的优先级。这不是地图的目的。
-
@drewag 很公平:
for drop in dropsToRemove { drop.removeFromSuperview() }仍然比桥接代码短得多。 -
@BrianNickel,而且这是类型安全的 :)
-
谢谢@BrianNickel。应该将其发布为答案吗?我总是很高兴看到使用桥接和选择器的更好方法...
标签: objective-c swift