web-dev-qa-db-ja.com

KeyPathは何に使用されますか?

Swift 4)では、Foundationチームの多くの人が、Swift 3.と比較して、keyPathsの使用がどれほど簡単かについて話し合っています...これは疑問を投げかけます...何keyPathですか?真剣に、明確なリソースが見つかりません。

11
Brandon Bradley

Objective-Cには、プロパティを直接ではなく動的に参照する機能があります。これらの参照は、キーパスと呼ばれます。これらは、実際に値を読み書きするのではなく、使用するために値を隠しておくだけなので、直接のプロパティアクセスとは異なります。

Cavaliersという構造体とPlayerという構造体を定義してから、それぞれのインスタンスを1つ作成しましょう。

// an example struct
struct Player {
    var name: String
    var rank: String
}

// another example struct, this time with a method
struct Cavaliers {
    var name: String
    var maxPoint: Double
    var captain: Player

    func goTomaxPoint() {
        print("\(name) is now travelling at warp \(maxPoint)")
    }
}

// create instances of those two structs
let james = Player(name: "Lebron", rank: "Captain")
let irving = Cavaliers(name: "Kyrie", maxPoint: 9.975, captain: james)

// grab a reference to the `goTomaxPoint()` method
let score = irving.goTomaxPoint

// call that reference
score()

最後の行は、scoreと呼ばれるgoTomaxPoint()メソッドへの参照を作成します。問題は、キャプテンのnameプロパティへの参照を作成できないことですが、keypathは作成できます。

let nameKeyPath = \Cavaliers.name
let maxPointKeyPath = \Cavaliers.maxPoint
let captainName = \Cavaliers.captain.name
let cavaliersName = irving[keyPath: nameKeyPath]
let cavaliersMaxPoint = irving[keyPath: maxPointKeyPath]
let cavaliersNameCaptain = irving[keyPath: captainName]

Xcode9または対応するスナップショットでテストしてください。

14
Durul Dalkanat