Ios 可选类型';字符串???';未拆开
“可选类型'String???'的值未展开;您是想使用'!'还是'?'?'?”- 我今天遇到了一个奇怪的编译器错误,由于Ios 可选类型';字符串???';未拆开,ios,swift,dictionary,optional,optional-parameters,Ios,Swift,Dictionary,Optional,Optional Parameters,“可选类型'String???'的值未展开;您是想使用'!'还是'?'?'?”- 我今天遇到了一个奇怪的编译器错误,由于String后面有两个问号,这完全让人困惑 我有一个类型为[String:String?]的字典s,还有一个函数,它接受所有参数作为String?s。具体而言(从5813将用户选择的信息复制到字典中),我有以下详细版本: func combine(firstname: String?, lastname: String?) {...} var text = combine(s
String
后面有两个问号,这完全让人困惑
我有一个类型为[String:String?]
的字典s
,还有一个函数,它接受所有参数作为String?
s。具体而言(从5813将用户选择的信息复制到字典中),我有以下详细版本:
func combine(firstname: String?, lastname: String?) {...}
var text = combine(s["kABPersonFirstNameProperty"], lastname: s["kABPersonLastNameProperty"])
我在第二行发现了错误,我想知道为什么会这样。如果
s
中的值是String?
类型,那么combine()
不应该接受它,因为它的参数应该是相同类型的吗?那么,我为什么会出现这个错误?我如何才能修复它 它曾经是可选的,因为您的字典值是可选的。它也是可选的,因为dictionary[key]返回可选的。所以你需要把它拆开两次
在操场上尝试此方法以了解问题(并查看可能的解决方案):
印刷品:
Optional(Optional("Hello"))
Optional("Hello")
Hello
但你也可以用其他方法,而不是让它打开。例如:
print(oos! ?? "n/a")
将强制展开它一次,然后在无的情况下打印内部字符串或n/a…Dictionary[key]
返回T2?
。如果密钥不存在,则返回nil
因此,如果T2是String?
,s[key]
返回String??
您不能将String???
作为String?
您也可以这样调用以展开和准备不存在的密钥
var text = combine(s["kABPersonFirstNameProperty"] ?? nil, lastname: s["kABPersonLastNameProperty"] ?? nil)
顺便说一下,下面的代码不会将值设置为nil,而是从字典中删除整个条目
s[key] = nil
如果希望值为nil而不是删除条目,则必须执行此操作
s[key] = nil as String?
也许最简单的解决方案是让字典保存
String
,而不是String?
。这样,您就不会遇到其他解决方案中描述的展开问题
或者您真的必须存储字符串?
类型吗?
您想区分“密钥存在但保留为零”和“密钥不存在”吗?HI MirekE,感谢您的快速响应。字典的值有时是
nil
,所以我应该使用什么标记,在哪里?我不能使用
因为它可能没有值,我尝试了s[key]??
,但遇到了另一个错误。有很多选项,例如,如果让使用两次,您可以使用。您好,谢谢您的输入。那么,我能做些什么来解决这个问题呢?当我尝试将作为字符串?
时,我收到一条消息说“'String???”不能转换为“String?”。请再次查看我修改后的答案:)有时需要为“value not exists”和“nil value exists”提供不同的逻辑含义@hebinda:当然,但这应该是一个明确的决定。我的印象是@Randoms真的想要一个[String:String]
而不是[String:String?]
。
s[key] = nil as String?