2017-02-09 50 views
2

有簡單的端點枚舉,如:斯威夫特:使URL從相對字符串基礎URL

enum TraccarEndpoint: Endpoint { 

    case server 

    var baseURL: URL { 
     return URL(string: "http://demo.traccar.org/api")! 
    } 

    var path: String { 
     switch self { 
     case .server: 
      return "/server" 
     } 
    } 

    var url: URL { 
     let path = self.path 
     let baseURL = self.baseURL 
     let url = URL(string: path, relativeTo: baseURL) 
     return url! 
    } 
} 

期待self.url = 「http://demo.traccar.org/server」,但self.url =「/服務器 - TTP:// www.traccar.org/api」。那是什麼?

+1

可以簡化您的網址屬性' var url:URL {return URL(string:path,relativeTo:baseURL)! }'也不需要在你的服務器字符串中包含斜槓'return「server」' –

回答

3

這是描述URL的方式。你的網址是正確的,不用擔心。打印url.absoluteString說服自己

你可以得到絕對URL與url.absoluteURL

+0

不是真的,小小的斜線產生了巨大的差異。當slash('/ server')在path組件中時我得到了錯誤(在Alamofire.request調用中使用url參數作爲URLConvertible,但是當我將該斜槓包含到baseURL並將其從路徑中移除時,一切正常! – zzheads

+0

而且在這兩種情況下(成功與失敗)url.absoluteString是一樣的... – zzheads

0

好,我複製你的代碼

enum TraccarEndpoint { 

    case server 

    var baseURL: URL { 
     return URL(string: "http://demo.traccar.org/api")! 
    } 

    var path: String { 
     switch self { 
     case .server: 
      return "/server" 
     } 
    } 

    var url: URL { 
     let path = self.path 
     let baseURL = self.baseURL 
     let url = URL(string: path, relativeTo: baseURL) 
     return url! 
    } 
} 

URL字符串是/服務器 - http://demo.traccar.org/api

不同的是TraccarEndpoint不繼承端點。 EndPoint是否有baseURL字符串是「http://www.traccar.org/api」? 如果是這樣,你可以看到這個網頁Method Dispatch in Swift

它可以幫助你知道關於swift的方法調度。

0

我找到了解決方案從路徑移動/到基本URL:

http://demo.traccar.org/api/ 

代替

http://demo.traccar.org/api 

和:的server代替/server