Избегать строки, которая будет считаться необязательной в swift - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть функция, в которой строковое значение определяется на основе значения в словаре.Если значение в словаре не найдено, я устанавливаю его в статическую строку.Строка постоянна (let):

let dict = [ 1: "a", 
             2: "b" ]

func x() {
    let index = someFunctionReturnsInt()
    let str = (nil != dict[index]) ? dict[index] : "N/A"

Таким образом, строка не может быть nil.Однако, когда я пытаюсь использовать str, Swift все равно считает это необязательным.Например:

    // still inside the same function
    os_log("Str is %@", str)

вернет ошибку компилятора:

Значение необязательного типа 'String?'должен быть развернут в значение типа 'String'

Дело в том, что я использую эту функцию довольно много раз, и добавление str ?? "N/A" в каждом случае не имеет смысла.Принудительное развертывание с str! кажется излишним: эта строка не критична для приложения, поэтому я не думаю, что прерывание выполнения, если оно отсутствует, имеет какой-то смысл.

То есть принудительное развертывание - единственное решение, или есть лучший способ определить строку как необязательную и «никогда не будет ноль»?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вы должны просто использовать оператор слияния nil при определении самого str.Проверка, имеет ли значение ноль, тогда все равно присваивать необязательное значение без разворачивания не имеет смысла.

let str = dict[index] ?? "N/A"
0 голосов
/ 22 ноября 2018

Проблема в том, что dict[index] по-прежнему возвращает необязательное значение, поэтому str должно быть необязательным.Есть два способа исправить это

Вы можете использовать оператор объединения nil, чтобы использовать dict[index], если это не ноль, в противном случае используйте «N / A»

let str = dict[index] ?? "N/A"

Другой вариант -использовать словарь по умолчанию значение индекса

let str = dict[index, default: "N/A"]
0 голосов
/ 22 ноября 2018

Вы должны использовать оператор объединения nil - let str = dict[index] ?? "N/A"

Вместо let str = (nil != dict[index]) ? dict[index] : "N/A"

Причина, по которой str все еще является необязательной в вашем случае, заключается в том, что dict[index] является необязательным, даже если выпроверяем, чтобы это было не ноль.Итак, swift выводит тип str как String?

Вы также можете принудительно развернуть, потому что вы уже проверяете его на ноль, как - let str = (nil != dict[index]) ? dict[index]! : "N/A"

Но принудительного развертывания следует избегатьпо возможности

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