一尘不染

Swift Beta 5中的bridgeToObjectiveC和makeObjectsPerformSelector

swift

我在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的新错误,还是发行说明中缺少的内容?


阅读 226

收藏
2020-07-07

共1个答案

一尘不染

bridgeToObjectiveCbridgeFromObjectiveC当你需要使用该类型的API迅捷的对象上的功能都没有在Xcode
6.0测试版5.相反,演员从相应的基金会类型/可用。例如:

var arr = ["One", "Two"]
(arr as NSArray).indexOfObject("One")

performSelector自从第一个Swift测试版以来,Apple就警告您(或明确使其不可用)使用和相关方法。可能是在Beta
5之前仍然可用的任何此类API都是无意的。

正如您提到的问题所指出的,您可以使用map它在数组的每个元素上调用函数/方法。您也可以使用filterfindfor-
in循环,或在强制转换为NSArray之后的一种enumerateObjects方法。请注意,许多人认为它不好的风格使用的编程功能,结构(mapfilterreducefind对于不属于“功能性”的任务)
-也就是运行有代码的副作用。因此,for-
in循环可能是您要做的最干净的方法。

2020-07-07