Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 可选类型';字符串???';未拆开_Ios_Swift_Dictionary_Optional_Optional Parameters - Fatal编程技术网

Ios 可选类型';字符串???';未拆开

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: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?