#swift #swiftui
#быстрый #свифтуи
Вопрос:
Я потратил некоторое время, пытаясь понять синтаксис, используемый в EnvironmentValues
, и я надеялся, что кто-нибудь сможет указать, допустил ли я какие-либо ошибки.
extension EnvironmentValues {
var isSensitive: Bool {
get { self[SensitiveKey.self] }
set { self[SensitiveKey.self] = newValue }
}
}
Насколько я понимаю, тело средства получения и установки использует синтаксис нижнего индекса, где первое self
ссылается на EnvironmentValues
словарь как на объект. Квадратные скобки позволяют передавать ключ в этот объект. Сам ключ представляет собой экземпляр SensitiveKey
метатипа , который является ранее определенным EnvironmentKey
. Это позволяет получить доступ к любым свойствам и методам типа, которые в данном случае были бы необходимы defaultValue
для EnvironmentKey
.
Правильно ли я это понял? Я был бы очень признателен, если бы вы могли прояснить любые возникшие у меня здесь недоразумения.
Ваше здоровье.
Ответ №1:
Вы уже близко. Согласно документации Swift:
private struct SensitiveKey: EnvironmentKey {
static let defaultValue: String = "SensitiveKey" // the default could be anything unique
}
extension EnvironmentValues {
var isSensitive: String {
get { self[SensitiveKey.self] }
set { self[SensitiveKey.self] = newValue }
}
}
extension View {
func isSensitive(_ isSensitive: String) -> some View {
environment(.isSensitive, isSensitive)
}
}
Ключ — это просто EnvironmentKey, а не мета-тип для isSensitive
. Это буквально ключ к словарному значению в EnvironmentValues. defaultValue
это неудачный выбор имени, который подразумевает изменчивость, поскольку сам ключ неизменяем.
Кроме того, когда вы видите .self
, это текущий экземпляр типа. .Self
будет относиться к типу.