2015-06-21 82 views
1

這裏是我的例子,讓我們說,我有一個自定義UIView與響應此功能的叩擊手勢識別:動態或靜態調度ObjC對象上的公共swift函數嗎?

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

我一般喜歡這些是私有的,所以我將其標記,但可以不工作。一個@objcdynamic符是必需的,就像這樣:

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

這使我相信,當添加到一個Objective-C對象的公共功能在默認情況下動態。是這樣嗎?請引用如果找到的參考。

回答

2

雨燕編譯器將試圖證明一個方法調用可以最終只有一個實施。如果它可以證明這一點,那麼它將使用靜態而不是動態分派。使用「最終」或「私人」關鍵字以及整個模塊優化將有助於此。

2

Using Swift with Cocoa and Objective-C

需要動態分配

雖然@objc屬性暴露你的 斯威夫特API的Objective-C的運行時,它並不能保證動態 派遣性質的,方法,下標或初始值設定項。 Swift編譯器仍然可以通過虛擬化或內聯成員訪問來優化代碼的性能,繞過Objective-C運行時。當 您使用動態修飾符標記成員聲明時,訪問 成員始終是動態分派的。由於標有動態修改聲明 使用Objective-C的 運行時出動,他們含蓄地標有@objc屬性。」

+0

我認爲這更多地將動態調度添加到Swift本機api。我的問題更多地涉及Objective-C超類的Swift子類。如果是這樣的話,那麼也許我是誤解。你能詳細說明一下嗎? – Logan

+0

我相信Greg Parker對http://stackoverflow.com/questions/24057525/swift-native-base-class-or-nsobject的回覆將有所幫助 – sbooth

相關問題