做者:Andyy Hope,原文連接,原文日期:2016-03-23
譯者:saitjr;校對:numbbbbb;定稿:shanksgit
Objective-C 已經出現好些年了。在這期間,開發者們遵循着各類代碼風格,但願能提升可讀性,爲從此的版本迭代作準備。可是 Swift 不一樣。Swift 仍是門很新的語言,沒有專門的或者最普遍的編碼風格能夠遵循。因此不少時候咱們須要本身去摸索。github
幸運的是,在我最近一年的工做中,Swift 佔到了 98.2%。在這期間,我學到了不少很棒的編碼風格,今天就來分享一下。swift
在 Swift 2.2 以前,selector 都須要傳入字符串,而且沒有自動補全。全憑手寫確實容易出錯。安全
let button = UIButton(type: .System) button.addTarget(self, action: Selector(「buttonTapped:」), forControlEvents: .TouchUpInside) ... func buttonTapped(sender: UIButton) { }
好的事件函數命名方法:對象名做爲前綴,動做做爲後綴。好比按鈕(button)點擊(tapped)事件命名爲 buttonTapped:
。此外,確保每次都給 sender 傳入正確的類型參數。即便不須要這個參數,你也最好把它傳進去,萬一要用到呢。app
下面是我推薦的事件函數命名:ide
func segmentedControlValueChanged(sender: UISegmentedControl) { } func barButtonItemTapped(sender: UIBarButtonItem) { } func keyboardWillShowNotification(notification: NSNotification) { }
在 Swift 2.2 中,selector 的寫法更加安全了,可是仍是很醜。此外,代碼片斷會散落在項目的各個地方,凌亂不堪。若是你用的是 MVC(Massive View Controller ?)怎麼辦?若是同一個 selector 會被屢次使用怎麼辦?函數
button.addTarget(self, action: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)
在瀏覽代碼的時候,上面這句代碼簡直不忍直視,太長,可讀性也不好。再腦補下你還要在不少地方使用它(複製粘貼…)。讓咱們來整合一下這些 selector,這樣須要時能夠直接引用,而且能夠在同一個地方修改。優化
private struct Action { static let buttonTapped = #selector(ViewController.buttonTapped(_:)) } ... button.addTarget(self, action: Action.buttonTapped, forControlEvents: .TouchUpInside)
簡直棒棒噠。如今咱們能夠在同一個地方定義這些 selector。任何一個想要使用 selector 的對象均可以直接從 Action
結構體取出靜態常量。咱們不得不將這個結構體命名爲 Action
,由於 Selector 這個更好的名字已經被 Selector
佔用了。ui
另外一個明智的作法是保持靜態常量和方法名的一致性,這樣便於記憶,風格統一。編碼
下面這個結構體聲明爲 private
是爲了防止 Xcode 報聲明衝突錯誤,這個結構體只能用於當前 .swift
文件。
我已經這樣寫了幾個月了,一直都沒遇到問題。可是今天早上我忽然意識到,這種模式還能再優化一下,還能更優雅。既然能用 Selector
extension,爲何還要用 Action
結構體呢?
private extension Selector { static let buttonTapped = #selector(ViewController.buttonTapped(_:)) } ... button.addTarget(self, action: .buttonTapped, forControlEvents: .TouchUpInside)
簡直完美!咱們給 Selector
加了一個 extension,它包含了咱們想要調用的 selector 的靜態常量。
這樣還能夠利用 Swift 的類型推斷。對象的 action:
參數須要 Selector
類型,咱們使用的就是 Selector
的屬性,所以能夠省略 Selector.
前綴(以前 Action
必須寫成 Action.buttonTapped:
)。
就像你要給 view 設置顏色時候,省略掉 UIColor.
同樣:
view.backgroundColor = .blackColor()
總之,但願你能喜歡這個 selector 語法糖。若是你想要在代碼中使用,請在 Twitter 上@我一下,很但願能看到你們都在用這種方式。
示例代碼已經放在 GitHub 上了。
簡直要上天了,沒想到個人文章被 Chris Lattner 轉發了???。
很是感謝你們的喜好、點贊、回覆、轉推。
本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg。