Почему «if let», похоже, не распаковывает значение, как раньше, в Swift 3 в бета-версии Xcode 8.3?

В отличие от предыдущего, я был удивлен, увидев, что 'title' теперь является необязательным (компилятор теперь генерирует waning: интерполяция строк создает описание отладки для необязательного значения; вы хотели сделать это явным?).

Как получилось, что выражение «if let title =» больше не распаковывает его? Что мне делать, чтобы распаковать в if?

// Go thru all publication where the tag has been found
for item in items {
  if let item = item as? [String: String?], let title = item["label"] {
    i += 1
    if let rawSummary = item["libSousTheme"] {
      print("\(i)) Tag [\(foundTag)] z[\(foundZTag)] in « \(title) »")
    }
    else {
      print("\(i)) Tag [\(foundTag)] z[\(foundZTag)] in « \(title) » (no summary!)")
    }
  }
}

person Stéphane de Luca    schedule 01.03.2017    source источник
comment
title должен был быть необязательным до Swift 3.1, так как вы выполняете приведение к [String: String?], а нижний индекс словаря использует nil для обозначения отсутствия значения для ключа (так что вы получаете двойную обертку для item["label"]). Как правило, вы никогда не захотите иметь словарь с необязательным типом Value — просто используйте необязательный тип Value и используйте nil, чтобы указать отсутствие значения для ключа (т. е. вместо этого привести к as? [String: String]).   -  person Hamish    schedule 02.03.2017
comment
Но как бы вы отличили несуществующее значение ключа от ключа, имеющего нулевое значение? @Хэмиш   -  person Stéphane de Luca    schedule 02.03.2017
comment
Разверните его во второй раз   -  person Hamish    schedule 02.03.2017
comment
Просто измените то, что у вас есть, на let title = item["label"] as? String, и оно будет работать так, как вы просите.   -  person creeperspeak    schedule 02.03.2017


Ответы (1)


Хорошо, тогда это, например, решает проблему:

если пусть item = item как? [Строка: Строка?], let title = item["label"] ?? ноль { /* … */ }

person Stéphane de Luca    schedule 01.03.2017
comment
item["label"] ?? nil — еще одна альтернатива, как показано на stackoverflow.com/q/33049246/2976878. - person Hamish; 02.03.2017