Проблема словаря Switft 'String?'не конвертируется в «String»;Вы хотели использовать «как!»заставить опуститься? - PullRequest
0 голосов
/ 05 декабря 2018

Я новичок в Swift и ObjC и не могу заставить этот простой кусочек кода работать.Я получаю сообщение об ошибке "String?"не конвертируется в «String»;Вы хотели использовать «как!»заставить опуститься?

    guard let data = context as? Dictionary<String,String> else {return}

    var str : String

    str = data["Score"] as String //<<<I get the error here

Когда я поменяю его на как!Я знаю, получить это предупреждение: Принудительное приведение от 'String?'«String» только разворачивает опционально;Вы хотели использовать '!'?

Есть идеи, как извлечь строку из словаря, чтобы я мог ее использовать?

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Мы не знаем, с какими типами данных вы работаете, но вы, скорее всего, либо получаете словарь на самом деле типа [String: String], и в этом случае вы бы:

func getData(context: [String: String]) {
    guard let str = context["Score"] else {
        return
    }
    print(str)
}

...или вы действительно получаете словарь типа [String: Any] (более распространенный для словарей базы данных), в этом случае вы бы:

func getData(context: [String: Any]) {
    guard let str = context["Score"] as? String else {
        return
    }
    print(str)
}
0 голосов
/ 05 декабря 2018

Используйте вот так:

if let dataDictionary = context as? [String: Any] {
        if let someString = dataDictionary["score"] as? String {
            print(someString)
        }
    }
0 голосов
/ 05 декабря 2018

Вам не нужно приводить, потому что data словарь всегда будет возвращать необязательный тип String, и вы можете использовать guard выражение

guard let str = data[Score] else { return }
// Your code here
0 голосов
/ 05 декабря 2018

Тип, возвращаемый подпиской Dictionary, является необязательным, поскольку допустимо использовать его с несуществующими ключами.Итак, согласно сообщению об ошибке, в словаре со значениями String тип возвращаемого значения - String?.

Если вы точно знаете, что ключ всегда существует в словаре, вы можете принудительно развернуть его.это как data["Score"]!, чтобы сделать тип String (без приведения, но сбой, если он не существует).В противном случае обработайте nil каким-либо образом, например, if let str = data["Score"] или str = data["Score"] ?? "0".

0 голосов
/ 05 декабря 2018

Возможно, что ключ "Score" не задан в вашем словаре и может возвращать ноль.Используйте этот код, чтобы развернуть необязательное значение:

if let score = data["Score"] {
    str = score
}

Поскольку вы уже развернули context до Dictionary<String, String>, Swift автоматически выведет тип score как строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...