我正在尝试更新服务器上的用户位置
使用此功能
func updateloc(lat : String?, long : String?) {
/code...
let data = "lat=\(lat!)&long=\(long!)"
}
这是代表
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
updateloc(String(manager.location?.coordinate.latitude), long: String(manager.location?.coordinate.longitude))
}
我对lat
和long
变量有可选(""),无法摆脱它。
知道怎么做吗?
答案 0 :(得分:4)
如果您打开像这样的纬度和经度值......
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let lat = manager.location?.coordinate.latitude,
let long = manager.location?.coordinate.longitude {
updateloc(String(lat), long: String(long))
}
}
...然后你可以在updateloc
函数中完全避免选项:
func updateloc(lat : String, long : String) {
// code...
let data = "lat=\(lat)&long=\(long)"
}
originalUser2
是对的......你应该养成安全解开选项的习惯,除非你有一个非常好的理由强行展开它们。并且只是试图摆脱可选的代码将编译不是一个很好的理由。
答案 1 :(得分:3)
updateloc(String(manager.location?.coordinate.latitude), ...)
该代码采用可选值(manager.location?.coordinate.latitude
),然后将其强制为String。这导致字符串"Optional(42.0)"
或其他。然后将其传递给updateloc
。
我认为latitude
是Double或类似的。在转换为String之前,您需要处理可选的Double,如下所示:
func coordToString(val: Double?) -> String {
return (val == nil ? "---" : String(val!))
}
...
updateloc(coordToString(manager.location?.coordinate.latitude), ...)
我经常将类似于coordToString
的函数作为模型对象本身的扩展(您的manager
或location
)。我将它们命名为formattedLatitude
或类似名称。这样,您应用中的所有屏幕都将使用相同的格式设置该值,因为他们都会使用相同的代码来执行此操作。这保留了规则,如果缺少纬度,则显示" ---"'在一个地方。
答案 2 :(得分:3)
为什么不检查位置是否不是nil
if let currentLocation = manager.location {
updateloc(String(currentLocation.coordinate.latitude), long: String(currentLocation.coordinate.longitude))
}
并使用非可选参数声明updateloc()
func updateloc(lat : String, long : String) {...}
为什么不呢
func updateloc(CLLocationCoordinate2D : coordinate) {
let data = "lat=\(coordinate.latitude)&long=\(coordinate.longitude)"
}
如果你正在使用String Interpolation ......
答案 3 :(得分:2)
我认为您通过在请求的查询字符串或正文中使用纬度和经度值发出HTTP请求来更新用户的位置。
您可以尝试几种选择:
Nil coalescing operator
强> 零合并运算符(a ?? b)如果包含值,则展开可选的 a ,或者返回默认值 b 如果 a nil 。表达式 a 始终是可选类型。表达式 b 必须与 a 中存储的类型相匹配。
假设我们在请求中为任何不存在的值发送空字符串:
func updateloc(lat : Double?, long : Double?) {
let latitude = String(lat) ?? ""
let longitude = String(long) ?? ""
let data = "lat=\(latitude)&long=\(longitude)"
...
}
Optional binding
强> 使用可选绑定来确定可选项是否包含值,如果是,则使该值可用作临时常量或变量。
假设我们没有触发任何不存在的值的请求:
func updateloc(lat : Double?, long : Double?) {
if let latitude = lat, longitude = long {
let data = "lat=\(latitude)&long=\(longitude)"
}
else {
// Don't make a request..
}
}
顺便说一下,将位置传递为CLLocationCoordinate2D
类型而不是分别传递纬度和经度更具可读性:
func updateloc(coordinate: CLLocationCoordinate2D?) {
if let coordinate = coordinate {
let data = "lat=\(coordinate.latitude)&long=\(coordinate.longitude)"
}
else {
// Don't make a request..
}
}
答案 4 :(得分:-1)
这不是此问题的确切答案,而是造成此类问题的原因之一。
就我而言, 我无法使用“ if let”和“ guard let”从字符串中删除Optional。
我遇到任何
let dict1 : [String:Any] = ["key":("value" as String?) as Any]
//use guard let, if let, default value but the string is still optional
if let a = dict1["key"] {
print("With Any \(a)")
}
//Output is: With Any Optional("value")
对于 AnyObject
let dict : [String:AnyObject] = ["key":("value" as String?) as AnyObject]
if let a = dict["key"] {
print("With AnyObject \(a)")
}
//Output is: With AnyObject value
因此,使用 AnyObject 代替 Any 可以迅速从字符串中删除可选内容。