Невозможно присвоить значение типа String ?? набрать "String?" ошибка - PullRequest
0 голосов
/ 16 июня 2020

допустим, я определил класс

class Dummy {

    var title: String?
}

, и у меня есть словарь как

let foo: [Int: String?]  = [:]

, а затем, когда я делаю назначение, как показано ниже

var dummy = Dummy()

dummy.title = foo[1]

он говорит:

Невозможно присвоить значение типа 'String ??' набрать 'String?'

Insert 'как! String '

тип возврата foo равен String?, а Dictionary возвращает необязательный тип своего значения при использовании подстрочного индекса, но что такое String?? тип в swift?

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

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Объявив свой словарь как [Int:String?], вы говорите, что ключ - это Int, а значения не являются обязательными String s. Теперь ключ может отсутствовать в словаре, поэтому foo[1] необязательно возвращает необязательный параметр, и в итоге вы получаете с необязательным необязательным - String??

Теперь, хотя иногда используются необязательные параметры, я не думайте, что в данном случае это именно то, что вам нужно.

Вы можете просто создать словарь [Int:String], а затем не вставлять элемент, если значение равно nil.

let foo: [Int: String]  = [:]
dummy.title = foo[1]

Если вам действительно нужно обработать случай, когда «есть значение для этого ключа, и оно nil», тогда вам может помочь оператор объединения nil:

dummy.title = foo[1] ?? nil

или даже

dummy.title = foo[1] ?? ""
0 голосов
/ 16 июня 2020

Поскольку наличие значения, соответствующего ключу 1 в словаре foo, является необязательным, а значение в словаре имеет тип String?, оно возвращает тип String??. Развертка значения один раз, чтобы проверить, существует ли значение, решит эту проблему

if let value = foo[1] {
    dummy.title = value
}
...