这让我头疼。
我有一本字典:
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"))
当然,在我的服务器上,由于这一点,搜索无法正常工作。
有关如何删除这个恼人的可选字符串的任何线索?
答案 0 :(得分:2)
如 @Eric D 所示,问题与您从字典中提取值的方式有关。
替换此
let lastName = String(formSearchValues["lastname"])
let firstName = String(formSearchValues["firstname"])
用这个
guard let
firstName = formSearchValues["firstName"] as? String,
lastName = formSearchValues["lastName"] as? String
else { fatalError() }
请注意,如果找不到
firstName
和lastName
的有效字符串,此代码会导致您的应用崩溃。 或者,您可以将fatalError()
指令替换为另一个流动指令,如return
。
如果您在firstName
或lastName
为&#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的内容。