如何从String Value Swift中删除Optional

时间:2018-04-17 21:05:54

标签: swift firebase-realtime-database

我想使用没有可选扩展名的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
}

3 个答案:

答案 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")

如果laststringnil,则会打印yourDefaultString

重要消息,使用Dictionary代替NSDictionary,使用Array而不是NSArray这是swift