作者:Nick Hanan禽篱,原文鏈接茅特,原文日期:2016-03-17
譯者:BigbigChai娇斑;校對(duì):walkingway;定稿:CMB
許多應(yīng)用程序都有訪問文件的需求吗铐。也許是應(yīng)用 bundle 或文件系統(tǒng)的文件东亦,又或許是網(wǎng)上的資源。在代碼里需要調(diào)用某些方法來指向這些文件唬渗。對(duì)于 Apple 平臺(tái)而言典阵,基本上只有兩個(gè)選擇:使用 String 或 NSURL。
使用過地址欄或任何終端的話镊逝,Swift 字符串將是一個(gè)非常容易理解的選擇壮啊。我的意思是,所有的文本都是在地址欄的撑蒜,對(duì)吧歹啼?Cocoa 和 Cocoa Touch SDK 中一些較舊的 API 都接收 NSURL 和字符串(通常在這些 API 中稱為“路徑”)作為參數(shù),但是都越來越朝著只使用 NSURL 的方向發(fā)展座菠。和 String 路徑相比狸眼,NSURL 有許多優(yōu)點(diǎn),最明顯的是可以訪問 URL 各個(gè)部分的屬性浴滴,而不必另外編寫代碼來從路徑的字符串解析出這些組件拓萌。
請(qǐng)繼續(xù)關(guān)注如何在 Swift 應(yīng)用程序中學(xué)習(xí)創(chuàng)建和使用 NSURL。
在 Swift 中創(chuàng)建 NSURL
在 Swift 中升略,有幾個(gè)構(gòu)造器和工廠方法可以用于創(chuàng)建 NSURL司志,但是我只打算說明其中比較有用的一部分甜紫。
init?(string URLString: String)
這是最普通,也許也是最常用的方法骂远。這需要 Swift 字符串版本的 URL囚霸,并將其轉(zhuǎn)換為 NSURL 對(duì)象。 這個(gè)構(gòu)造器允許失敗激才,因?yàn)椴皇撬凶址寄苌珊戏ǖ?URL拓型。有一些字符無法在 URL 中使用,因此需要使用 % 編碼瘸恼,它的出現(xiàn)表示了可以在 URL 中發(fā)送的編碼劣挫。我個(gè)人最常見的是 %20,”空格“字符东帅。這個(gè)構(gòu)造器只接收有效的字符压固,它不會(huì)另外做 % 編碼。因此靠闭,如果任何無法轉(zhuǎn)換為合法 URL 的內(nèi)容或字符串出現(xiàn)時(shí)帐我,該構(gòu)造器將返回 nil。
let NSHipster = NSURL(string: "http://nshipster.com/") //returns a valid URL
let invalidURL = NSURL(string: "www.example.com/This is a sentence"); //Returns nil
這實(shí)際上是以下構(gòu)造器的便利構(gòu)造器愧膀。
init?(string URLString: String, relativeToURL baseURL: NSURL?)
這是允許定制的構(gòu)造器拦键。類似上一個(gè)構(gòu)造器,它也是可失敗的檩淋,接收類似的 URL Swift 字符串芬为,同時(shí)也接受一個(gè)可選的 baseURL 對(duì)象(本身也是 NSURL)。如果 baseURL 為空蟀悦,則完全使用 URLString 創(chuàng)建 URL媚朦,這也許就是第一個(gè)構(gòu)造器的內(nèi)在實(shí)現(xiàn)。
let NSHipsterTwo = NSURL(string: "http://nshipster.com/", relativeToURL: nil) //Returns valid NSHipster URL
let article = NSURL(string: "ios9/", relativeToURL: NSHipster)
init(fileURLWithPath path: String, isDirectory isDir: Bool)
這類似于上面的構(gòu)造器日戈,只是用于指向本地文件或目錄莲镣。我不確定為什么本地文件需要一個(gè)特殊版本,但我猜測(cè)它進(jìn)行了一些優(yōu)化(至少是以文件 scheme 開頭涎拉,而不是 http 之類)。有另一個(gè)版本沒有 isDirectory 參數(shù)的圆,但已知路徑是否目錄的話鼓拧,頭文件建議使用這個(gè)方法。也許因?yàn)榱硪粋€(gè)版本將需要再執(zhí)行檢查越妈,而這一個(gè)方法讓用戶提供了答案季俩,能省下檢查的步驟。
public init(fileURLWithPath path: String, isDirectory isDir: Bool, relativeToURL baseURL: NSURL?)
這是 iOS 9 中新增的方法梅掠。與上個(gè)方法類似酌住,只是還加了 relativeToURL 參數(shù)店归。類似之前的構(gòu)造器,這將返回一個(gè)NSURL酪我,并將路徑附加到 baseURL 后消痛。如果有一個(gè)目錄內(nèi)的幾個(gè)文件,有需求對(duì)這些文件進(jìn)行迭代的時(shí)候都哭,就可以利用這個(gè)方法了秩伞。可以提供文件所在的目錄作為 baseURL欺矫,然后只需使用文件名作為 Swift 字符串路徑創(chuàng)建 URL纱新。
將 URL 轉(zhuǎn)換回 Swift 字符串
有時(shí)候,特別是在處理較舊的 API 或要向用戶展示時(shí)穆趴,需要將 NSURL 轉(zhuǎn)換回 Swift 字符串脸爱。好在 NSURL 提供了一個(gè)簡(jiǎn)單的只讀屬性 absoluteString 來獲取字符串。 NSURL 對(duì)象只需調(diào)用該屬性就能獲得:
let articleString = article?.absoluteString
//ArticleString now contains: "http://nshipster.com/ios9/"
在這種情況未妹,接收了之前使用 relativeToURL 版本的構(gòu)造器定義的 article 常量簿废,從 scheme 直到結(jié)尾(在這種情況下是一個(gè)路徑)把它解析成一個(gè)完整的 URL。如果一個(gè) URL 包含文件擴(kuò)展名(file extension)教寂,查詢(query)和片段(fragment)捏鱼,也會(huì)把它們解析出來±腋可失敗的構(gòu)造器返回了原來的 article 對(duì)象导梆,因此仍然有那個(gè)表示 Swift 可選鏈的問號(hào)。
修改 NSURL
這些函數(shù)都是基于被調(diào)用的 NSURL 返回一個(gè)新的迂烁、根據(jù)需求修改過的 NSURL看尼。他們不改變被調(diào)用的NSURL。
func URLByAppendingPathComponent(pathComponent: String, isDirectory: Bool) -> NSURL
這個(gè)方法給 URL 添加更多的路徑組件盟步,例如說你要添加一個(gè)文件到當(dāng)前目錄(存儲(chǔ)在調(diào)用的 NSURL)藏斩。跟其他一些構(gòu)造器一樣,它有另一個(gè)沒有 isDirectory 參數(shù)的版本却盘。但如果能明確它是否為目錄的話狰域,建議使用這一個(gè)。因?yàn)檫@能省去用來確定是否目錄的元數(shù)據(jù)檢查黄橘。
var URLByDeletingLastPathComponent: NSURL? {get}
此屬性將返回一個(gè)新的兆览、刪除了最后一個(gè)路徑組件的 NSURL。這只修改 URL 的路徑組件塞关,URL 的其他組件(例如域名)不受影響抬探。我們可以這樣寫:
//articleTwo now contains "http://nshipster.com/ios9/"
let deletePathComp = articleTwo?.URLByDeletingLastPathComponent
//deletePathComp now contains "http://nshipster.com/"
沒有路徑信息的話,結(jié)果可能會(huì)變得有點(diǎn)詭異帆赢。為了好玩小压,我鏈?zhǔn)秸{(diào)用了幾個(gè)URLByDeletingLastPathComponent线梗,但最后只是在后面附加了“../”,類似命令行(cd ..)返回上一個(gè)目錄怠益。
還有幾個(gè)修改方法和屬性仪搔,但這些可能是最常用的了。
Conclusion
All code in this post was tested in Xcode 7.3.1.
如果你好奇 URL 格式規(guī)范的細(xì)節(jié)溉痢,可以查看 Apple 的 NSURL 類型參考在處理 URL 部分提到的 RFC 文檔僻造。初始化 URL 時(shí)使用的字符串必須符合 RFC 2396,并且 URL 本身根據(jù) RFC 1738 和 RFC 1808 進(jìn)行解析孩饼。這些規(guī)范內(nèi)容很多髓削,但你能找到所有可能關(guān)于 URL,URI 等的信息镀娶。
NSURL 中還有很多其他的屬性立膛。如果你想要一個(gè)完全解析的 NSURL,baseURL梯码,主機(jī)(host)宝泵,查詢(query),片段(fragment)等轩娶,你可以查看 Apple 的 NSURL 類型參考儿奶。但對(duì)我個(gè)人而言,主要使用了 absoluteString鳄抒,偶爾也會(huì)用到 pathExtension闯捎。
希望這篇文章對(duì)你有幫助。如果有许溅,請(qǐng)?jiān)?Twitter 或任何社交媒體上分享這個(gè)帖子瓤鼻,每次分享都有裨益。當(dāng)然贤重,如果有任何問題茬祷,也請(qǐng)?jiān)?a target="_blank" rel="nofollow">聯(lián)系頁面 或 Twitter @CodingExplorer 上聯(lián)系我,我會(huì)盡量解答的并蝗。謝謝祭犯!
參考來源
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)滚停,最新文章請(qǐng)?jiān)L問 http://swift.gg沃粗。