作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
“可选类型 'String??' 的值未展开;您是否打算使用“!”或者 '?'?” -
我今天遇到了这个奇怪的编译器错误,由于 String
之后的两个 问号,这完全令人困惑。
我有一个字典 s
,类型为 [String : String?]
,还有一个接受所有参数为 String?
的函数.具体来说(来自 5813 的 method 将用户选择的信息复制到字典中),我有以下内容的详细版本:
func combine(firstname: String?, lastname: String?) {...}
var text = combine(s["kABPersonFirstNameProperty"], lastname: s["kABPersonLastNameProperty"])
我在第二行收到错误,我想知道为什么会这样。如果 s
中的值是 String?
类型,那么它不应该被 combine()
接受,因为它的参数应该是同一类型?那么,为什么我会收到此错误,我该如何解决呢?
最佳答案
Dictionary<T1, T2>[key]
返回 T2?
.这是为了在 key 不存在的情况下返回 nil。
所以如果 T2 是 String?
, s[key]
返回 String??
你不能通过 String??
作为String?
您也可以像这样调用来解包并为不存在的 key 做准备
var text = combine(s["kABPersonFirstNameProperty"] ?? nil, lastname: s["kABPersonLastNameProperty"] ?? nil)
顺便说一下,下面的代码不会将值设置为 nil,而是会从字典中删除整个条目
s[key] = nil
如果您希望值为 nil 而不是删除条目,则必须这样做
s[key] = nil as String?
关于ios - 可选类型 'String??' 未展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31869176/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!