Swift - 从字典中删除双重可选字符串

时间:2016-07-14 13:10:53

标签: swift swift2

这让我头疼。

我有一本字典:

var formSearchValues : Dictionary<String, Any?> 

然后我调用一个函数向服务器发送一些数据,为此我需要为params创建额外的字典。

let lastName = String(formSearchValues["lastname"])
let firstName = String(formSearchValues["firstname"])

searchProvider(lastName, firstName: firstName)

然后我有我的函数searchProvider:

func searchProvider(lastName: String, firstName : String){

let params = [
            "lastname": fathersLast == "" ? NSNull() : fathersLast,
            "firstname": NSNull(),
            "email" : state.userEmail,
            "male": false,
            "female": false,
            "taxid": NSNull(),
            ] as Dictionary<String, AnyObject>

           // print params
           print(params)

           // make call to server

}

当我打印我的参数时,我看到:

"lastname": Optional(Optional("Smith"))

当然,在我的服务器上,由于这一点,搜索无法正常工作。

  

有关如何删除这个恼人的可选字符串的任何线索?

3 个答案:

答案 0 :(得分:2)

@Eric D 所示,问题与您从字典中提取值的方式有关。

解决方案1 ​​

替换此

let lastName = String(formSearchValues["lastname"])
let firstName = String(formSearchValues["firstname"])

用这个

guard let
        firstName = formSearchValues["firstName"] as? String,
        lastName = formSearchValues["lastName"] as? String
        else { fatalError() }
  

请注意,如果找不到firstNamelastName的有效字符串,此代码会导致您的应用崩溃。   或者,您可以将fatalError()指令替换为另一个流动指令,如return

解决方案2

如果您在firstNamelastName为&#39; nils&#39;时有默认值。那么这里是代码

let defaultValue = ""
let firstName = (formSearchValues["firstName"] as? String) ?? defaultValue
let lastName = (formSearchValues["lastName"] as? String) ?? defaultValue

答案 1 :(得分:0)

字典总是返回一个Optional。

您的问题是,在您的字典中,值也是选项:

var formSearchValues : Dictionary<String, Any?> 
                                             ^ value is an Optional

这使得输出成为双重可选(嵌套的Optionals),这当然不方便。

我建议你重构首先没有Optionals作为值,或者如果你必须保持这种方式,那么是的,你必须将每个值解包两次。

答案 2 :(得分:0)

如果&#34;姓氏&#34;保证在字典中并具有关联值,您可以执行以下操作:

let lastName = String(formSearchValues["lastname"]!!)

这将打开选项并留下一个字符串。

如果密钥可能并不总是存在或者可能没有值,则不要这样做。在这种情况下使用类似appzYourLife's answer的内容。