Зеркальная переменная, возвращающая ноль - PullRequest
0 голосов
/ 30 апреля 2018

Это работает, как ожидалось

struct ProgrammingLanguage {
    let name: String?
}
let language = ProgrammingLanguage(name: "Swift")
let mirror = Mirror(reflecting: language.name)
print(mirror.children.first?.value)

// Optional("Swift")

При удалении опционально печатается ноль

struct ProgrammingLanguage {
    let name: String
}
let language = ProgrammingLanguage(name: "Swift")
let mirror = Mirror(reflecting: language.name)
print(mirror.children.first?.value)

// nil

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Цитировать Зеркальная документация , Mirror - это:

Представление подструктуры и стиля отображения экземпляра любого типа.

Проблема в том, что String не имеет подструктуры, поэтому у нее нет дочерних элементов. Чтобы проверить его значение с помощью Mirror, вы должны взять children из ProgrammingLanguage.

Это работает для необязательного String, потому что сам Optional<T> может быть проверен, и его единственный дочерний элемент является связанным значением.

0 голосов
/ 30 апреля 2018

Попробуйте это

struct ProgrammingLanguage {
    let name: String
}
let language = ProgrammingLanguage(name: "Swift")
let mirror = Mirror(reflecting: language)
for (name, value) in mirror.children {
    guard let name = name else { continue }
    print("\(name): \(type(of: value)) = '\(value)'")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...