我正在解析带有东西的字典以生成Rocket对象。在解析方法中,我使用guard进行检查。是否可以使用guard来检查字典中的现有值,并同时打开它?
let rocketDictionary : [String : String?] = [ "name" : nil, "numberOfThrusters" : nil ]
func generateRocketSchematics(rocketDictionary : [String : String?]) {
guard let rocketName = rocketDictionary["name"] as? String else {
print("no rocket name")
return
}
print(rocketName)
}
由于as? String
,此代码无法编译。如果我删除它,rocketName将是一个字符串?是否可以编写guard语句,以便返回String
答案 0 :(得分:1)
您可以使用与guard/case
进行模式匹配:
func generateRocketSchematics(rocketDictionary : [String : String?]) {
guard case let rocketName?? = rocketDictionary["name"] else {
print("no rocket name")
return
}
print(rocketName) // rocketName is a String
}
rocketName??
是.Some(.Some(rocketName))
的同义词,所以
case let rocketName?? = rocketDictionary["name"]
匹配rocketDictionary["name"]
(具有。{1}}的情况
类型String??
)不是nil
,而是未包装的值(具有
类型String?
)也不是nil
。双重打开的价值
(类型String
)然后被分配到rockedName
。