Понимание синтаксиса значений среды

#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 будет относиться к типу.