做者:codingexplorer,原文連接,原文日期:2018-07-18 譯者:Damonwong;校對:numbbbbb,BigNerdCoding;定稿:Forelaxhtml
譯者注: 此篇文章之前咱們曾經翻譯過,原文做者在今年對這篇文章進行了更新,咱們也對更新後的文章進行了翻譯並再次發佈。ios
對於大部分應用來講,都須要訪問一些文件資源。這些文件資源可能在你的應用安裝包中,或者在文件系統內,亦或者在某個網站服務器上。你須要用某種方法將它們體如今代碼中。對於蘋果平臺而言,你主要有兩種選擇,用字符串或者 URL
。git
若是你使用過瀏覽器的地址欄或者在終端中輸入過地址,你可能會選擇使用字符串,畢竟,在這些地方你只能輸入字符串。雖然在 Cocoa
和 Cocoa Touch
SDKs 中許多舊的 API 同時採用 URL
和字符串 (對於這些 API 來講,這些字符串一般被稱爲 "path") 做爲參數,可是愈來愈多的 API 傾向於只能用 URL
對象。相比較於字符串路徑來講,URL
對象有更多的優點,最明顯的優點就是你能夠直接經過屬性訪問 URL
的不一樣的部分,而不須要本身編寫一個解析組件來解析路徑字符串的不一樣部分。github
緊跟個人步伐,接下來咱們學習如何在 Swift 應用中建立和使用 URL
對象。swift
URL
對象在 Swift 中有好幾個構造器和工廠方法可用於建立 URL
對象,下面我要講一些更有用的初始化方法。瀏覽器
這個是普通的,也是最經常使用的初始化方法。將一個用於表示 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
這是一個指定構造器。和上面的構造器同樣,也是一個可失敗的構造器,並且須要一個相似 URL
的 Swift 字符串和一個可選的 baseURL
對象,這個 baseURL
自己也是一個 URL
對象。若是 baseURL
爲 nil
,那麼內部會像第一個構造器同樣,根據提供的 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
複製代碼
該構造方法與上一個構造方法相似,可是他的字符串參數指向的是本地文件或者目錄。我不太肯定爲何會有一個本地文件的特殊版本,我猜有多是作了一些優化(至少須要是文件 scheme
開頭,而不該該是 http
之類的)。雖然有一個不須要傳 isDirectory
參數的構造器,但若是你知道它是不是一個目錄時,蘋果建議你使用這個這個方法。在我看來,有可能另一個構造器在內部本身判斷了輸入參數是不是一個目錄,而這個方法經過傳入參數避免了檢查。優化
這是在 iOS 9 中新加入的方法,這與前一個相似,但新增了 relativeToURL
參數。和以前的構造器同樣,它將返回一個將路徑附加到 baseURL
的 URL
對象。當你須要爲了某個事情重複訪問某個目錄下的不一樣文件時,可使用這個初始化方法。你能夠將文件所在的目錄做爲 baseURL
,而後只須要一個文件名做爲 Swift 字符串路徑來建立 URL
對象。
有時你須要將 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
添加更多的路徑組件,好比當你要添加一個文件到你所在的目錄(存儲在這個方法調用返回的 URL
)時,這個方法就能夠派上用處。像咱們前面提到的那個初始化方法同樣,這個方法也有一個沒有 isDirectory
參數的版本,可是不管你是否知道它是否是一個目錄,都更推薦你使用這個方法來確保元數據能夠存儲在正確的目錄下。
這個方法將會返回刪除了最後一個路徑組件的新 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 1738 和 RFC 1808 被解析。這些規範內容不少,但你能找到全部可能關於 URL,URI 等的信息。
若是你完整查閱 URL
的文檔的話,還能夠看到它擁有 baseURL
,host
,query
,fragment
等等很是多的屬性,全部這些屬性都能在 Apple 文檔中查詢到。不過對我來講,平常使用最多的仍是 absoluteString
,偶爾也會用到 pathExtension
我但願你能以爲這篇文章對你有所幫助。若是你以爲有用,請不要猶豫,在 Twitter 或者其餘社交媒體上分享這篇文章。固然,若是你有任何疑問,請隨時經過 聯繫頁面 或者 Twitter@CodingExplorer 與我聯繫。我會盡量的幫助你。謝謝。
URL Class Reference – Apple Inc.
本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 swift.gg。