在你的 Swift 應用中建立或修改 URL

做者:codingexplorer,原文連接,原文日期:2018-07-18 譯者:Damonwong;校對:numbbbbbBigNerdCoding;定稿:Forelaxhtml

譯者注: 此篇文章之前咱們曾經翻譯過,原文做者在今年對這篇文章進行了更新,咱們也對更新後的文章進行了翻譯並再次發佈。ios

對於大部分應用來講,都須要訪問一些文件資源。這些文件資源可能在你的應用安裝包中,或者在文件系統內,亦或者在某個網站服務器上。你須要用某種方法將它們體如今代碼中。對於蘋果平臺而言,你主要有兩種選擇,用字符串或者 URLgit

若是你使用過瀏覽器的地址欄或者在終端中輸入過地址,你可能會選擇使用字符串,畢竟,在這些地方你只能輸入字符串。雖然在 CocoaCocoa Touch SDKs 中許多舊的 API 同時採用 URL 和字符串 (對於這些 API 來講,這些字符串一般被稱爲 "path") 做爲參數,可是愈來愈多的 API 傾向於只能用 URL 對象。相比較於字符串路徑來講,URL 對象有更多的優點,最明顯的優點就是你能夠直接經過屬性訪問 URL 的不一樣的部分,而不須要本身編寫一個解析組件來解析路徑字符串的不一樣部分。github

緊跟個人步伐,接下來咱們學習如何在 Swift 應用中建立和使用 URL 對象。swift

在 Swift 中建立一個 URL 對象

在 Swift 中有好幾個構造器和工廠方法可用於建立 URL 對象,下面我要講一些更有用的初始化方法。瀏覽器

init?(string URLString: String)

這個是普通的,也是最經常使用的初始化方法。將一個用於表示 URL 的 Swift 字符串轉變成一個 URL 對象。但並非全部的字符串均可以有效的表示一個 URL,因此這是一個可失敗構造器。因爲有些字符不能在 URL 中使用,所以須要進行 URL 編碼,將這些不能使用的字符轉化爲能夠在 URL 中發送的編碼。我我的見過最多的是 %20,也就是「空格」字符。這個構造器須要有效的字符,它不會爲你進行 URL 編碼轉化。若是字符串中包含沒法轉換爲有效 URL 的字符或者內容,構造器將會返回 nil服務器

let NSHipster = URL(string: "http://nshipster.com/") //返回一個有效的 URL
let invalidURL = URL(string: "www.example.com/This is a sentence") //返回 nil
複製代碼

這個構造器實際上是下面這個構造器的一個便利構造器。app

init?(string: String, relativeTo: URL?)

這是一個指定構造器。和上面的構造器同樣,也是一個可失敗的構造器,並且須要一個相似 URL 的 Swift 字符串和一個可選的 baseURL 對象,這個 baseURL 自己也是一個 URL 對象。若是 baseURLnil,那麼內部會像第一個構造器同樣,根據提供的 URL 字符串生成一個 URL 對象。學習

let NSHipsterTwo = URL(string: "http://nshipster.com/", relativeTo: nil) //返回一個有效的 NSHipster URL
let article = URL(string: "ios9/", relativeTo: NSHipster) //返回 "http://nshipster.com/ios9/" URL 
複製代碼

init(fileURLWithPath: String, isDirectory: Bool)

該構造方法與上一個構造方法相似,可是他的字符串參數指向的是本地文件或者目錄。我不太肯定爲何會有一個本地文件的特殊版本,我猜有多是作了一些優化(至少須要是文件 scheme 開頭,而不該該是 http 之類的)。雖然有一個不須要傳 isDirectory 參數的構造器,但若是你知道它是不是一個目錄時,蘋果建議你使用這個這個方法。在我看來,有可能另一個構造器在內部本身判斷了輸入參數是不是一個目錄,而這個方法經過傳入參數避免了檢查。優化

init(fileURLWithPath: String, isDirectory: Bool, relativeTo: URL?)

這是在 iOS 9 中新加入的方法,這與前一個相似,但新增了 relativeToURL 參數。和以前的構造器同樣,它將返回一個將路徑附加到 baseURLURL 對象。當你須要爲了某個事情重複訪問某個目錄下的不一樣文件時,可使用這個初始化方法。你能夠將文件所在的目錄做爲 baseURL,而後只須要一個文件名做爲 Swift 字符串路徑來建立 URL 對象。

將 URL 轉回 Swift 字符串

有時你須要將 URL 對象轉回 Swift 字符串,特別是在處理舊的 API 或者向用戶展現情形下。值得慶幸的是,URL 提供了一個簡單的只讀屬性來解決這個問題: absoluteString。只須要在你的 URL 對象調用該屬性便可:

let articleString = article?.absoluteString
// articleString 如今包含 = 的值是 "http://nshipster.com/ios9/"
複製代碼

在這個例子中,咱們使用了 relativeToURL 版本的構造器定義了一個 article 常量,將其解析爲從 scheme 開始的完整 URL (在這種狀況下是一個路徑)。若是這個 URL 上有文件拓展名,query 或者 fragment,它依舊能夠被解析。原來的 article 對象是由一個可失敗構造器返回的,這就是爲何那兒有一個 Swift 可選訪問。

修改一個 URL 對象

咱們接下來所說的這些方法,每個都會在請求修改完成時根據調用的 URL 對象返回一個新的 URL 對象。它們不會更改調用它們的 URL 對象。

func appendingPathComponent(String, isDirectory: Bool) -> URL

這個方法能夠爲你的 URL 添加更多的路徑組件,好比當你要添加一個文件到你所在的目錄(存儲在這個方法調用返回的 URL)時,這個方法就能夠派上用處。像咱們前面提到的那個初始化方法同樣,這個方法也有一個沒有 isDirectory 參數的版本,可是不管你是否知道它是否是一個目錄,都更推薦你使用這個方法來確保元數據能夠存儲在正確的目錄下。

func deletingLastPathComponent() -> URL

這個方法將會返回刪除了最後一個路徑組件的新 URL 對象。這方法適用於 URL 的路徑部分,URL 的其餘部分不受影響,好比域名。因此咱們能夠這樣子作:

let articleTwo = NSHipster?.appendingPathComponent("ios9", isDirectory: true)
//articleTwo 如今包含的 URL 字符是 "http://nshipster.com/ios9/"

let deletePathComp = articleTwo?.deletingLastPathComponent
//deletePathComp 如今包含的 URL 字符是 "http://nshipster.com/"
複製代碼

譯者注: 在 Swift 4.2 以前,deletingLastPathComponent 是一個屬性,所以在調用時不用加括號。在 4.2 版本中,deletingLastPathComponent 變成了方法 所以若是你在 4.2 上運行上面一段代碼,須要在 articleTwo?.deletingLastPathComponent 最後加一個括號才能正確運行

若是沒有路徑信息,可能有點兒奇怪。爲了好玩,我鏈式調用了幾回 URLByDeletingLastPathComponent,最後只是添加了 「../」,相似於在命令行(cd ..)中上一個目錄。

固然還有幾種修改方法和屬性,但這些多是最經常使用的。

總結

若是你對 URL 格式規範感興趣的話,能夠去查看蘋果的 URL 參考文檔中,關於如何處理 URL 這部分說起到的 RFC 文檔。用於初始化的字符串必須符合 RFC 2396,而且 URL 將會根據 RFC 1738RFC 1808 被解析。這些規範內容不少,但你能找到全部可能關於 URL,URI 等的信息。

若是你完整查閱 URL 的文檔的話,還能夠看到它擁有 baseURLhostqueryfragment 等等很是多的屬性,全部這些屬性都能在 Apple 文檔中查詢到。不過對我來講,平常使用最多的仍是 absoluteString,偶爾也會用到 pathExtension

我但願你能以爲這篇文章對你有所幫助。若是你以爲有用,請不要猶豫,在 Twitter 或者其餘社交媒體上分享這篇文章。固然,若是你有任何疑問,請隨時經過 聯繫頁面 或者 Twitter@CodingExplorer 與我聯繫。我會盡量的幫助你。謝謝。

參考

URL Class Reference – Apple Inc.

本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 swift.gg

相關文章
相關標籤/搜索