我在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的解决方法,我只是尚未更新该部分。
我认为处理完成处理程序的解决方案可能是将数组视为NSArray,如下所述: makeObjectsPerformSelector的快速等效项是什么
(dropsToRemove as NSArray).makeObjectsPerformSelector("removeFromSuperview")
但是,假设我正确使用了语法,只会导致另一个错误“ makeObjectsPerformSelector”不可用:“ performSelector”方法不可用
这是Swift的新错误,还是发行说明中缺少的内容?
在bridgeToObjectiveC和bridgeFromObjectiveC当你需要使用该类型的API迅捷的对象上的功能都没有在Xcode 6.0测试版5.相反,演员从相应的基金会类型/可用。例如:
bridgeToObjectiveC
bridgeFromObjectiveC
var arr = ["One", "Two"] (arr as NSArray).indexOfObject("One")
performSelector自从第一个Swift测试版以来,Apple就警告您(或明确使其不可用)使用和相关方法。可能是在Beta 5之前仍然可用的任何此类API都是无意的。
performSelector
正如您提到的问题所指出的,您可以使用map它在数组的每个元素上调用函数/方法。您也可以使用filter,find或for- in循环,或在强制转换为NSArray之后的一种enumerateObjects方法。请注意,许多人认为它不好的风格使用的编程功能,结构(map,filter,reduce,find对于不属于“功能性”的任务) -也就是运行有代码的副作用。因此,for- in循环可能是您要做的最干净的方法。
map
filter
find
for
in
NSArray
enumerateObjects
reduce