+-
不能将类型'String??'的值分配给类型'String?'错误。

假设我定义了一个类

class Dummy {

    var title: String?
}

而我有一本字典作为

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

然后当我做一个如下的任务时

var dummy = Dummy()

dummy.title = foo[1]

它说

不能将类型'String??'的值赋给类型'String?'。

插入'as! 字符串'。

返回类型 fooString?Dictionary 当使用下标时,返回其值类型的可选值,但什么是下标?String?? 类型为swift?

我觉得做这样的赋值应该是合法的.为什么它会抱怨,我应该如何做这个赋值呢?

0
投票

由于在字典里有一个与键1相对应的值。foo 是可选的,字典中的值是类型为 String? 它返回类型 String??. 解开一次包装来检查该值是否存在将解决这个问题。

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

通过声明你的字典为 [Int:String?] 你的意思是说,钥匙是一个 Int 和值是可选的 Strings. 现在钥匙可能不在字典中出现,所以。foo[1] optionally返回一个可选的选项,最后你会得到一个带有可选的选项------。String??

虽然有时会用到可选的选项,但我不认为这就是你想要的。

你可以简单地制作一个 [Int:String] 如果该值为 nil.

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

如果你确实需要处理 "这个键有一个值,而且它是 nil",那么nil-coalescing运算符可能会帮助你。

dummy.title = foo[1] ?? nil

甚至

dummy.title = foo[1] ?? ""