2016-03-15 23 views
2

由於可以在swift 2.2版本中得出結論,可以通過#selector引用Objective-C方法。引用Objective-C方法的Swift#選擇器

let sel = #selector(UIView.insertSubview(_:at:)) // produces the Selector "insertSubview:atIndex:" 

所以以前我們穿的用的名字一樣簡單的字符串方法:"doBangBang"並調用它Selector("doBangBang"),現在我們應該使用它像參考方法MyClass.doBangBang()並與關鍵字#selector(MyClass.doBangBang())的使用情況如何?此功能是否棄用Selector?除了減少用錯誤名稱執行的函數的數量之外,這些改進還有什麼好處?

+0

請參閱https://github.com/apple/swift-evolution/blob/master/proposals/0022-objc-selectors.md中的「動機」。還要注意,這主要是爲了與較早的Objective-C框架進行互操作而引入的,因爲在新的代碼封閉中是一個更好的解決方案。 – Sulthan

回答

2

此功能有效棄用使用Selector("methodName"),也只是使用"methodName""methodName:"選擇器。

主要的好處是你不能在方法字符串中輸入拼寫錯誤,因爲你已經在問題中說明了。

想象的方法有一個選擇:

..., selector: "myMethod:") 

什麼,當你錯字發生什麼呢?

..., selector: "mymethod:") 

它崩潰。

有了新的系統它是類型安全的:編譯器可以檢查你調用的方法確實存在 - 沒有更多的錯別字,不會有更多的調用不存在的功能:

..., selector: #selector(myMethod)) 

,因爲編譯器檢查類型。我們還從Xcode獲得了自動建議和自動完成功能,以及所有類型安全操作的細節。