What is a KeyPath used for?

前端 未结 1 1736
暗喜
暗喜 2021-01-11 12:24

In Swift 4 many on the Foundation team have discussed how much easier it is to use keyPaths as compared to Swift 3. This begs the question... What is a keyPath? Seriously, I

相关标签:
1条回答
  • 2021-01-11 12:48

    Objective-C has the ability to reference a property dynamically rather than directly. These references, called keypaths. They are distinct from direct property accesses because they don't actually read or write the value, they just stash it away for use.

    Let define a struct called Cavaliers and a struct called Player, then create one instance of each:

    // 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()
    

    The last lines create a reference to the goTomaxPoint() method called score. The problem is, we can't create a reference to the captain's name property but keypath can do.

    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]
    

    Please test with Xcode 9 or capable snapshot.

    0 讨论(0)
提交回复
热议问题