2016-04-05 130 views
1

我試圖更新服務器無法擺脫可選()字符串

用戶位置使用此功能

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變量,無法擺脫它。

任何想法如何做到這一點?

+3

不要強制拆包。永遠。你應該學會如何[正確處理optionals。](http://stackoverflow.com/a/36360605/2976878) – Hamish

+0

@ originaluser2「Ever」?這絕對沒有幫助。這是語言的原因,在很多情況下你都需要它。 –

+2

@EwanMellor好吧,也許有一對*邊緣情況下的力量解包是好的...但是,當開始與可選項,避免像瘟疫一樣的力量解開是要走的路。 – Hamish

回答

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是正確的..你應該習慣於安全地解開可選項,除非你有強有力的理由解開它們。只是試圖擺脫可選的代碼將編譯不是一個很好的理由。

3

updateloc(String(manager.location?.coordinate.latitude), ...)

即代碼正在一個可選值(manager.location?.coordinate.latitude),然後迫使爲字符串。這導致字符串"Optional(42.0)"或其他。然後它傳遞給updateloc

我推測latitude是Double或類似的。你需要轉換前處理可選雙爲字符串,像這樣的東西:

func coordToString(val: Double?) -> String { 
    return (val == nil ? "---" : String(val!)) 
} 

... 

updateloc(coordToString(manager.location?.coordinate.latitude), ...) 

我經常把類似coordToString功能的擴展模型對象本身(您managerlocation)上。我會把它們命名爲formattedLatitude或類似的東西。這樣,應用中的所有屏幕都將使用相同的格式來表示該值,因爲它們都將使用相同的代碼來執行此操作。這保留了「如果緯度缺失,在一個地方顯示」---「'的規則。

+0

return val?.description ?? 「---」 – user3441734

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

如果你使用爲什麼不檢查字符串插值無論如何...

2

我想你正在更新用戶的位置,通過請求中的查詢字符串或正文中的緯度和經度值進行HTTP請求。

有幾個選項,你可以嘗試:

  1. Nil coalescing operator

的零合併運算(A?B)解開可選一個如果包含一個值,或返回默認值b if a。表達式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
  • 您使用可選綁定來確定可選是否包含值,如果是,則創建該值lue可用作臨時常量或變量。

    假設我們不觸發任何不存在的值的請求:

    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.. 
        } 
    }