2017-05-26 21 views
1

具体的には、セレクタの有無にかかわらずタスクを補完することができる場合、一方向を優先する理由がありますか?セレクタなしスウィフトでセレクタを使用する理由はありますか?

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

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

B):

A)を使用してセレクター:

は、例えば、NSTimerは、2つの方法で間隔でメソッドを実行することができ

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ドキュメントを見るだけです。 'Timer.scheduledTimer'のブロック版はmacOS 10.12とiOS 10.0で追加されました。 – rmaddy

答えて

2

ターゲット/セレクターデザインは、APIの以前のObjective-C、ブロック前の日から残った手荷物です。

今日、AppleがこれらのAPIをすべてやり直すと、ターゲット/セレクタのデザイン全体が消え、すべてがブロック/クロージャに置き換えられます。このアイデアは、新しいApple APIによってサポートされています。例 - 古いUIAlertViewがデリゲートを使用しました。新しいUIAlertControllerはアラートアクションのクロージャ/ブロックのみを使用します。

ターゲット/セレクタ手法を使用する場合よりも、クロージャ(Swift)またはブロック(Objective-C)を使用するほうがはるかに優先されます。

  1. 恐ろしい "認識されないセレクター" エラー:ここ

    ターゲット/セレクタを使用しての問題です。

  2. セレクタのために追加のトップレベルメソッドを作成する必要があります。
  3. セレクタメソッドで間違ったパラメータとデータ型を指定する可能性があります。
  4. ターゲット/セレクタを必要とするオブジェクトを設定した時点での現在のコンテキストをすべて失います。

これらのすべての逆は、クロージャ/ブロックフォームを使用する利点です。

時間の経過とともに、デリゲートバージョンのAPIの多くは非推奨になり、クロージャ/ブロックバージョンに置き換えられる可能性があります。選択肢がある場合は、後で更新する必要を避けるためにクロージャ/ブロックフォームを使用することをお勧めします。

関連する問題