我想使用没有可选扩展名的String值。我使用以下代码从firebase解析这些数据:
Database.database().reference(withPath:
"Locations").child("Cities").observe(.value, with: { (snapShot) in
if snapShot.exists() {
let array:NSArray = snapShot.children.allObjects as NSArray
for child in array {
let snap = child as! DataSnapshot
let cityName = snap.key
let cityNameString = "\(cityName)"
if snap.value is NSDictionary {
let data:NSDictionary = snap.value as! NSDictionary
let lat = data.value(forKey: "lat")
let lng = data.value(forKey: "lng")
let radius = data.value(forKey: "radius")
let latstring = "\(lat)"
let lngstring = "\(lng)"
let radiusstring = "\(radius)"
let city = CityObject(name: cityNameString , lat: latstring , lng: lngstring, radius: radiusstring)
print("Value is", laststring)
self.selectCity(cityObject: city)
}
}
}
})
解析此数据后,我尝试打印例如latstring并得到以下outpup:
值为可选(52.523553)
我的CityObject如下所示:
class CityObject{
var name: String?
var lat: String?
var lng: String?
var radius: String?
init(name: String?, lat: String?, lng: String?, radius: String?){
self.name = name
self.lat = lat
self.lng = lng
self.radius = radius
}
答案 0 :(得分:1)
就像@GioR所说,值是Optional(52.523553),因为latstring的类型是隐式的:String?。这是因为 let lat = data.value(forKey:" lat") 会返回一个字符串吗?它隐式设置lat的类型。 见https://developer.apple.com/documentation/objectivec/nsobject/1412591-value 有关值的文档(forKey :)
斯威夫特有很多处理零的方法。可能对你有帮助的三个, 零合并运算符:??
如果可选结果为nil,则此运算符给出默认值:
let lat: String = data.value(forKey: "lat") ?? "the lat in the dictionary was nil!"
守卫声明
guard let lat: String = data.value(forKey: "lat") as? String else {
//Oops, didn't get a string, leave the function!
}
guard语句允许你将一个可选项转换为它的非可选等价物,或者你可以退出该函数,如果碰巧是nil
if let
if let lat: String = data.value(forKey: "lat") as? String {
//Do something with the non-optional lat
}
//Carry on with the rest of the function
希望这有助于^^
答案 1 :(得分:0)
那是因为你的价值实际上是可选的。你可以做
if let myString = laststring {
print("Value is ", myString)
}
或提供默认值
print("Value is ", laststring ?? "")
(在这种情况下,提供的默认值为“”)
答案 2 :(得分:0)
Optional
是因为您正在打印可选值?
。
print("Value is", laststring!)
以上代码不会打印Optional
。但是为了安全起见,请避免使用强制广播并使用guard
。
guard let value = lastString else {return}
print("Value is", value)
或者您可以使用Nil Coalescing运算符。
print("Value is", laststring ?? "yourDefaultString")
如果laststring
为nil
,则会打印yourDefaultString
。
重要消息,使用Dictionary
代替NSDictionary
,使用Array
而不是NSArray
这是swift
。