KeyPath Composition
The last keypath concept that we should tackle is keypath composition: Swift allows you to dynamically combine KeyPath types at runtime if the types match up.
In order to showcase this, we will go back to our User and Address struct:
struct User {
let address: Address
}
struct Address {
let street: String
}
Example
Based on this structure, we will take two different keypaths; first, one to the address property on the User, and then one on the String property on the Address:
let addressKeyPath = \User.address
let streetKeyPath = \Address.street
Given these two variables, we can now compose them to manifest a new keypath at runtime that goes from User to the street:
let newKeyPath = addressKeyPath.appending(path: streetKeyPath)
Here, we created a new KeyPath<User, String> at runtime by joining a KeyPath<User, Address> and a KeyPath<Address, String>. However, what should Swift do if you try to merge a KeyPath<User, String> and a KeyPath<House, Int>. Obviously, there's no relationship between these types. Swift solves this by introducing laws of keypath composition. Lets have a look at them.
