Swift keyPath против протокола - PullRequest
2 голосов
/ 29 апреля 2019

Я понимаю основную идею keyPaths, но я не понимаю его вариантов использования. Если вы уже знаете тип экземпляра, вы можете легко получить доступ к его свойствам. Если вы этого не сделаете, протокол уже поддерживает свойства только для чтения и чтения-записи. Может кто-нибудь объяснить мне, что мне не хватает? Что-нибудь, что мы не можем сделать с протоколами, кроме keyPaths или когда keypaths лучше чем протоколы?

1 Ответ

5 голосов
/ 29 апреля 2019

Если вы уже знаете тип экземпляра, вы можете легко получить доступ к его свойствам.Если вы этого не сделаете, протокол уже поддерживает свойства только для чтения и чтения-записи.Может кто-нибудь объяснить мне, что мне не хватает?

То, что вы упускаете, - это ощущение того, что неизвестно.

В обоих ваших предложениях вы говорите о знании свойств экземпляра.Это не проблема ключевых путей решить.Ключевые пути не имеют ничего общего со знанием типа;они не находятся ни в какой оппозиции типам или протоколам.Напротив, прежде чем вы сможете использовать путь ключа, вы должны точно знать , каковы свойства экземпляра.

Пути ключа для случая, когда неизвестно, является , который собственность для доступа.Они предоставляют способ передать свойство ссылка , чтобы кто-то еще мог получить доступ к этому свойству.

Например, вот тип Person:

struct Person {
    let firstName : String
    let lastName : String
}

А вот функция, которая сортирует массив Persons по или firstName или lastName, не зная , что один для сортировки:

func sortArrayOfPersons(_ arr:[Person], by prop: KeyPath<Person, String>) -> [Person] {
    return arr.sorted { $0[keyPath:prop] < $1[keyPath:prop] }
}

Ключевой путь - это то, как вы указываете этой функции , какое свойство использовать в качестве основы для сортировки.

...