2017-05-26 93 views
1

具體來說,當一個任務可以用選擇器或不用選擇器補充時,是否有任何(客觀)理由偏好一種方式而不是另一種方式?是否有任何理由在Swift中使用選擇器?

A)使用選擇:

let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction()), userInfo: nil, repeats: true) 

dynamic func timerAction() { 
    print("foo")  
} 

B)沒有選擇器:

例如,一個NSTimer可以以兩種方式運行上的間隔的方法

let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in 
    self.timerAction() 
} 

func timerAction() { 
    print("foo") 
} 

兩個版本是完全有效的,那麼是否有任何(客觀)理由相互偏好?

+0

塊版本是一個iOS10 +方法只適用於您的情況。如果您的目標是iOS9,則無法使用它。 – Larme

+0

@Larme有趣。兩者都在macOS 10.12上工作,但我不能早些講話。 –

+2

@BrandonBradley只需查看文檔。在MacOS 10.12和iOS 10.0中添加了塊版本的Timer.scheduledTimer。 – rmaddy

回答

2

目標/選擇器設計是早期的Objective-C在API前一天封閉的行李。

如果蘋果今天要重做所有這些API,那麼整個目標/選擇器設計將消失,並全部用塊/閉包代替。更新的Apple API支持此想法。示例 - 舊的UIAlertView使用了一個委託。較新的UIAlertController僅使用閉合/塊來執行警報操作。

使用閉包(Swift)或塊(Objective-C)比使用目標/選擇器方法更受歡迎。

這裏有問題,使用目標/選擇:

  1. 可怕的 「無法識別選擇」 錯誤。
  2. 需要爲選擇器創建額外的頂級方法。
  3. 在選擇器方法中指定錯誤參數和數據類型的可能性。
  4. 在設置需要目標/選擇器的對象時,丟失所有當前上下文。

與所有這些相反的是使用閉包/塊表單的好處。

可能的是,隨着時間的推移,很多代理版本的API將被棄用,並被閉包/塊版本所取代。如果你有選擇,我建議現在使用閉包/塊表單以避免稍後更新,更不用說它只是更簡單的解決方案。

相關問題