Swift允许在字典中使用nil

Swift允许在字典中使用nil,swift,dictionary,optional,Swift,Dictionary,Optional,我有一个简单的函数,比如 func foo(a: String?, b:String, c: String){ SomeClass.bla("param", props: [ "a": a, "b": b, "c": c, ]) } 如果a为nil,我只希望道具不包含a键,否则包含a及其字符串值(非可选)。在字典声明中有好的方法吗 我的代码当然不起作用,我得到了可选类型的值。。未展开错误对于a您可以使用三元运算符(?:)进行您提到的简单

我有一个简单的函数,比如

func foo(a: String?, b:String, c: String){
    SomeClass.bla("param", props: [
       "a": a,
       "b": b,
       "c": c,
    ])
}
如果
a
nil
,我只希望道具不包含
a
键,否则包含
a
及其字符串值(非可选)。在字典声明中有好的方法吗


我的代码当然不起作用,我得到了可选类型的
值。。未展开
错误对于
a

您可以使用三元运算符(?:)进行您提到的简单检查

func foo(a: String?){
    SomeClass.bla("param", props: a == nil ? [:] : [ "a": a! ]);
}
由于您更新了您的问题,合适的解决方案是:

func foo(a: String?, b:String, c: String){
    var props = [
        "b": b,
        "c": c,
    ]

    if let aValue = a {
        props["a"] = aValue
    }

    SomeClass.bla("param", props: props)
}

您可以使用三元运算符(?:)进行您提到的简单检查

func foo(a: String?){
    SomeClass.bla("param", props: a == nil ? [:] : [ "a": a! ]);
}
由于您更新了您的问题,合适的解决方案是:

func foo(a: String?, b:String, c: String){
    var props = [
        "b": b,
        "c": c,
    ]

    if let aValue = a {
        props["a"] = aValue
    }

    SomeClass.bla("param", props: props)
}

只需将字典创建为
var
,然后添加
a
值。仅当下标逻辑不是
nil
时,才会添加
a

func foo(a:String?, b:String, c: String) {
    var dict = ["b": b, "c": c]
    dict["a"] = a
    SomeClass.bla("param", props: dict)
}

非常感谢@Sulthan在下面的评论中提出的优雅建议。

只需将字典创建为
var
,然后添加
a
值。仅当下标逻辑不是
nil
时,才会添加
a

func foo(a:String?, b:String, c: String) {
    var dict = ["b": b, "c": c]
    dict["a"] = a
    SomeClass.bla("param", props: dict)
}


非常感谢@Sulthan在下面的评论中提出的优雅建议。

在哪里声明了
bar
?它是如何定义的?它的类型是什么?你可以创建一个类型为
[String:String?]
的字典,所以你声明这个条的方式肯定有问题()这里的语法也有问题:
条([“a”:a])
。。。那应该是干什么的?
bar
是某种功能吗?您需要显示更多的代码,并准确指定哪一行显示错误。我稍微更正了这个问题,现在它更有意义了吗?
bar
声明在哪里?它是如何定义的?它的类型是什么?你可以创建一个类型为
[String:String?]
的字典,所以你声明这个条的方式肯定有问题()这里的语法也有问题:
条([“a”:a])
。。。那应该是干什么的?
bar
是某种功能吗?您需要显示更多的代码,并指定显示错误的行。我已稍微更正了问题,现在是否更有意义?我已编辑了问题,我的字典中有多个参数是的,我已更新了该情况的答案我已编辑了问题,我的字典中有多个参数是的,我已经更新了这种情况的答案,还有一件有趣的事,如果让a=a检查,你不需要这个
。这只是
nil
存在问题的文本值
dict[“a”]=nil
很好用。@Sulthan:对不起,我不明白。
var dict=[“b”:b,“c”:c]
dict[“a”]=a
。够了。如果让a=a
条件,则不需要
。@Sulthan:如果
SomeClass.bla的
props
参数定义为
[String:String]
,则不会编译,因为您正在将
字符串?
添加为值。已在上面发布
var dict:[String:String]=[“b”:b,“c”:c]
dict[“a”]=a
是所需的全部代码。有趣的是,如果让a=a
检查,您不需要
。这只是
nil
存在问题的文本值
dict[“a”]=nil
很好用。@Sulthan:对不起,我不明白。
var dict=[“b”:b,“c”:c]
dict[“a”]=a
。够了。如果让a=a
条件,则不需要
。@Sulthan:如果
SomeClass.bla的
props
参数定义为
[String:String]
,则不会编译,因为您正在将
字符串?
添加为值。已在上面发布<代码>变量dict:[String:String]=[“b”:b,“c”:c]
dict[“a”]=a
是所需的全部代码。