文書   >   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"]
以下も見よ
言語の相互運用性
Objective-C and C Code Customization (Objective-C と C コードのカスタム化)
Objective-C API にマクロを適用して、Swift にインポートする方法をカスタム化します。
Migrating Your Objective-C Code to Swift (Objective-C コ ードを Swift に移行する)
あなたのコードを移行するための推奨手順をご覧ください。
Cocoa Design Patterns (ココアデザインパターン)
Swift アプリで ココアデザインパターンを採用し、相互運用します。
Handling Dynamically Typed Methods and Objects in Swift (Swift で動的に型指定されたメソッドとオブジェクトの処理)
Objective-C id 型のインスタンスを特定の Swift 型にキャストします。
Imported C and Objective-C APIs (インポートされた C および Objective-C API
ネイティブの Swift 構文を使用して、C および Objective-C の型および関数と相互運用します。
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ