以下是我的示例,假设我有一个自定义UIView
,其中包含一个响应此功能的点击手势识别器:
func handleTap(tap: UITapGestureRecognizer) {
println("Tap!")
}
我通常更喜欢这些是私人的,所以我将其标记为这样,但它不起作用。需要@objc
或dynamic
说明符,如下所示:
dynamic private func handleTap(tap: UITapGestureRecognizer) {
println("Tap!")
}
这让我相信公共函数在添加到objective-c对象时默认是动态的。是这样的吗?如果找到,请引用参考文献。
答案 0 :(得分:2)
来自Using Swift with Cocoa and Objective-C:
需要动态调度
虽然@objc属性暴露了你的 Swift API到Objective-C运行时,它不保证动态 调度属性,方法,下标或初始化程序。斯威夫特 编译器仍然可以虚拟化或内联成员访问以进行优化 代码的性能,绕过Objective-C运行时。什么时候 使用动态修饰符标记成员声明,访问 该成员始终是动态调度的。因为声明 使用Objective-C调度标记为动态修饰符 运行时,它们用@objc属性隐式标记。“
答案 1 :(得分:2)
Swift编译器将尝试证明对方法的调用只能以单个实现结束。如果它可以证明这一点,那么它将使用静态而非动态调度。使用" final"或者"私人"关键字和整个模块优化将有助于此。