Swift beta 5中的bridgeToObjectiveC和makeObjectsPerformSelector

kas*_*lat 4 objective-c swift

我有一个完成处理程序的代码,在Xcode 6 beta 4中工作,不再适用于Xcode 6 beta 5.

dropsToRemove.bridgeToObjectiveC().makeObjectsPerformSelector("removeFromSuperview")
Run Code Online (Sandbox Code Playgroud)

全方法......

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")
        })
}
Run Code Online (Sandbox Code Playgroud)

错误是'[UIView]'没有名为'bridgeToObjectiveC'的成员

请注意,该方法中的CGFloat和Uint转换用于beta 4解决方法,我还没有更新该部分.这个问题包括在: 'CGFloat'不能转换为'UInt8'和其他CGFloat问题与Swift和Xcode 6 beta 4

我认为处理完成处理程序的解决方案可能是将数组视为NSArray,如下所述: 什么是makeObjectsPerformSelector的swift等价物?

(dropsToRemove as NSArray).makeObjectsPerformSelector("removeFromSuperview")
Run Code Online (Sandbox Code Playgroud)

但是,假设我的语法正确,只会导致另一个错误'makeObjectsPerformSelector'不可用:'performSelector'方法不可用

这是一个新的Swift错误,还是我在发行说明中缺少的东西?

ric*_*ter 8

这些bridgeToObjectiveCbridgeFromObjectiveC函数在Xcode 6.0 beta 5中不可用.相反,当您需要在Swift对象上使用该类型的API时,可以使用相应的Foundation类型.例如:

var arr = ["One", "Two"]
(arr as NSArray).indexOfObject("One")
Run Code Online (Sandbox Code Playgroud)

performSelector自从第一个Swift测试版以来,Apple已经警告过(或明确地说不可用)使用和相关的方法.据推测,在测试版5之前仍然可用的任何此类API都是无意的.

作为引用注释的问题,您可以使用map在数组的每个元素上调用函数/方法.你也可以使用filter,find或者for- in环,或铸造后NSArray,的一个enumerateObjects方法.请注意,许多人认为它不好的风格使用的编程功能,结构(map,filter,reduce,find对于不属于"功能性"的任务) -也就是说,要运行具有代码的副作用.所以a for- inloop可能是你做的事情最干净的方式.