是动态还是静态调度ObjC对象的公共swift函数?

时间:2015-06-21 14:16:17

标签: ios objective-c swift dispatch

以下是我的示例,假设我有一个自定义UIView,其中包含一个响应此功能的点击手势识别器:

func handleTap(tap: UITapGestureRecognizer) {
    println("Tap!")
}

我通常更喜欢这些是私人的,所以我将其标记为这样,但它不起作用。需要@objcdynamic说明符,如下所示:

dynamic private func handleTap(tap: UITapGestureRecognizer) {
    println("Tap!")
}

这让我相信公共函数在添加到objective-c对象时默认是动态的。是这样的吗?如果找到,请引用参考文献。

2 个答案:

答案 0 :(得分:2)

来自Using Swift with Cocoa and Objective-C

  

需要动态调度

     

虽然@objc属性暴露了你的   Swift API到Objective-C运行时,它不保证动态   调度属性,方法,下标或初始化程序。斯威夫特   编译器仍然可以虚拟化或内联成员访问以进行优化   代码的性能,绕过Objective-C运行时。什么时候   使用动态修饰符标记成员声明,​​访问   该成员始终是动态调度的。因为声明   使用Objective-C调度标记为动态修饰符   运行时,它们用@objc属性隐式标记。“

答案 1 :(得分:2)

Swift编译器将尝试证明对方法的调用只能以单个实现结束。如果它可以证明这一点,那么它将使用静态而非动态调度。使用" final"或者"私人"关键字和整个模块优化将有助于此。