无法摆脱Optional()字符串

时间:2016-04-05 16:59:46

标签: ios swift cllocationmanager

我正在尝试更新服务器上的用户位置

使用此功能

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))

    }

我对latlong变量有可选(""),无法摆脱它。

知道怎么做吗?

5 个答案:

答案 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的函数作为模型对象本身的扩展(您的managerlocation)。我将它们命名为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请求来更新用户的位置。

您可以尝试几种选择:

  1. Nil coalescing operator
  2.   

    零合并运算符(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)"
       ...
    }
    
    1. Optional binding
    2.   

      使用可选绑定来确定可选项是否包含值,如果是,则使该值可用作临时常量或变量。

      假设我们没有触发任何不存在的值的请求:

      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 可以迅速从字符串中删除可选内容。