文書   >   Swift   >   Swift で Objective-C 実行時機能を使用する


記事


Using Objective-C Runtime Features in Swift


(Swift で Objective-C 実行時機能を使用する)


セレクタとキーパスを使用して、動的な Objective-C API とやり取りします。





概観


target-action などの一部の Objective-C API は、メソッドまたはプロパティ名をパラメーターとして受け入れ、それらの名前を使用してメソッドまたはプロパティを動的に呼び出したり、アクセスしたりします。Swift では、#selector および #keyPath 式を使用して、これらのメソッド名またはプロパティ名をそれぞれセレクタまたはキーパスとして表します。


セレクタを使用して Objective-C メソッドの呼び出しを調整


Objective-C では、セレクタは Objective-C メソッドの名前を参照する型です。Swift では、Objective-C セレクタは Selector 構造体で表され、#selector 式を使用してそれらを作成します。


Swift では、#selector 式内にメソッドの名前を配置することにより、Objective-C メソッドのセレクタを作成します:#selector(MyViewController.tappedButton(_:))。プロパティの Objective-C のゲッターメソッドまたはセッターメソッドのセレクタを作成するには、#selector(getter:MyViewController.myButton) のように getter: または setter: ラベルを使用してプロパティ名に接頭辞を付けます。以下の例は、touchUpInside イベントに応答してメソッドを呼び出すために、ターゲットアクションパターンの一部として使用されるセレクタを示しています。


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

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

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

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


オーバーロードされた関数間で明確にする必要がある場合は、括弧付きの式を as 演算子と共に使用して、#selector 式が特定のオーバーロードを明確に参照するようにします。


キーパスを使用して Objective-C プロパティに動的にアクセス


Objective-C では、キーはオブジェクトの特定のプロパティを識別する文字列です。キーパスは、ドットで区切られたキーの文字列であり、横断するオブジェクトプロパティのシーケンスを指定します。キーとキーパスは、文字列識別子を使用してオブジェクトの属性と関係に間接的にアクセスするためのメカニズムであるキー値コーディング (KVC) にしばしば使用されます。


重要

Objective-C のキーパスは、Swift でのキーパス式とは異なりますが、関連しています。キーパス式の詳細については、プログラミング言語 Swift (Swift 4.1)キーパス式 を参照してください。




訳注

原文では Swift 4.1 だが、ここでは勿論 Swift 5.0 にリンクしている。また、原文では Key-Path Expression へのリンクだがクリックしてみると Expressions (式) へリンクされる。この章にはキーパス式もあるため、おそらく Swift のバージョンアップでリンク切れを起こしたのだろう。




#keyPath 文字列式を使用して、value(forKey:)value(forKeyPath:) などの KVC メソッドで使用できるコンパイラがチェックしたキーとキーパスを作成します。#keyPath 文字列式は、連鎖メソッドまたはプロパティ参照を受け入れます。また、#keyPath(Person.bestFriend.name) などのチェーン内の optional 値によるチェーンもサポートしています。#keyPath 文字列式を使用して作成されたキーパスは、キーパスを受け入れる API に参照するプロパティまたはメソッドに関する型情報を渡しません。


以下の例では、Person クラスを定義し、その 2 つのインスタンスを作成し、いくつかの #keyPath 文字列式を使用して、プロパティとそれらのプロパティのプロパティにアクセスします。


class Person: NSObject {
    @objc var name: String
    @objc var friends: [Person] = []
    @objc var bestFriend: Person? = nil

    init(name: String) {
        self.name = name
    }
}

let gabrielle = Person(name: "Gabrielle")
let jim = Person(name: "Jim")
let yuanyuan = Person(name: "Yuanyuan")
gabrielle.friends = [jim, yuanyuan]
gabrielle.bestFriend = yuanyuan
 
#keyPath(Person.name)
// "name"
gabrielle.value(forKey: #keyPath(Person.name))
// "Gabrielle"
#keyPath(Person.bestFriend.name)
// "bestFriend.name"
gabrielle.value(forKeyPath: #keyPath(Person.bestFriend.name))
// "Yuanyuan"
#keyPath(Person.friends.name)
// "friends.name"
gabrielle.value(forKeyPath: #keyPath(Person.friends.name))
// ["Yuanyuan", "Jim"]


以下も見よ





言語の相互運用性

















トップへ












トップへ












トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

  • 言語:Swift
  • SDK
  • Xcode 9.0+

  • フレームワーク
  • Swift 標準ライブラリ
  • 概観
  • 以下も見よ












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)