it-swarm-ja.com

これは、送信者を取り込んでそのパラメーターのラベルを付けるSwift関数のアンチパターンですか?

これは私がココアのいたるところに見ているものです:

func someAction(_ sender: Any)

これは次のように呼ばれます:

someAction(someObject)

これは私にとって非常に混乱する可能性があります。悪名高い例はNSViewサブクラスにあります。

print("Hello, World!")

これは標準のSwiftコンソールに印刷するための構文ですが、NSViewで、送信者が文字列"Hello, World!"であると主張して、プリンタダイアログを開きます。 、私のコードで私はこれを始めました:

func someAction(sender: Any)

しかし、私がココアでこれをnoneと見ているという事実は、それがアンチパターンであることを意味するのではないかと心配しています。 そうですか、それとも私は正しいですか?

3
Ben Leggiero

いいえ、そうではありません。純粋なSwiftはおそらく_を使用せず、むしろsender、またはラベル、次に変数名を優先します。_の使用はすべてSwiftコードは、Obj-Cがこの変更のおかげでSwift 3に変換される方法だからです。 名前の背後にあるSwift 3の理論的根拠

おそらく、Obj-CやCocoaと緊密に連携していて、命名規則を同じに保ちたい場合は、_を使用できますが、必須ではありません。 これはAppleの許容可能なSwift _を使用しない3つのコード のドキュメントからの直接の例です:

import UIKit

class MyViewController: UIViewController {
    let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))

    override init?(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        let action = #selector(MyViewController.tappedButton)
        myButton.addTarget(self, action: action, forControlEvents: .touchUpInside)
    }

    func tappedButton(sender: UIButton?) {
        print("tapped button")
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}
4
Alex