Swift beta 5中的bridgeToObjectiveC和makeObjectsPerformSelector

时间:2014-08-04 19:33:27

标签: objective-c 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解决方法,我还没有更新该部分。该问题包括在: ‘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错误,还是我在发行说明中缺少的东西?

2 个答案:

答案 0 :(得分:8)

Xcode 6.0 beta 5中不提供bridgeToObjectiveCbridgeFromObjectiveC函数。而是在需要在Swift对象上使用该类型的API时,转换为适当的Foundation类型。例如:

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

the question you cited所述,您可以使用map在数组的每个元素上调用函数/方法。您还可以使用filterfindfor - in循环,或在转换为NSArray之后使用其中一种enumerateObjects方法。请注意,许多人认为使用functional-programming结构(mapfilterreducefind)来处理非“功能性”的任务时风格很糟糕 - 也就是说,运行具有side effects的代码。因此,for - in循环可能是您完成目标的最干净方式。

答案 1 :(得分:1)

Apple的某些人声称那些bridgeToObjectiveCbridgeFromObjectiveC函数是私有函数,即仅供Apple内部使用,并且它们会消失。

如果您碰巧在开发者计划中,我会尝试在开发者论坛中找到该声明的链接。