在 Swift 應(yīng)用里構(gòu)造和修改 NSURL

作者: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 1738RFC 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沃粗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铐刘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌影晓,老刑警劉巖镰吵,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檩禾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疤祭,警方通過查閱死者的電腦和手機(jī)盼产,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勺馆,“玉大人戏售,你說我怎么就攤上這事〔菽拢” “怎么了灌灾?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悲柱。 經(jīng)常有香客問我锋喜,道長(zhǎng),這世上最難降的妖魔是什么豌鸡? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任嘿般,我火速辦了婚禮,結(jié)果婚禮上涯冠,老公的妹妹穿的比我還像新娘炉奴。我一直安慰自己,他們只是感情好蛇更,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布瞻赶。 她就那樣靜靜地躺著,像睡著了一般械荷。 火紅的嫁衣襯著肌膚如雪共耍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天吨瞎,我揣著相機(jī)與錄音痹兜,去河邊找鬼。 笑死颤诀,一個(gè)胖子當(dāng)著我的面吹牛字旭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崖叫,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼遗淳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了心傀?” 一聲冷哼從身側(cè)響起屈暗,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后养叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體种呐,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年弃甥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽室。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淆攻,死狀恐怖阔墩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓶珊,我是刑警寧澤啸箫,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站艰毒,受9級(jí)特大地震影響筐高,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丑瞧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一柑土、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绊汹,春花似錦稽屏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至获雕,卻和暖如春薄腻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届案。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工庵楷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楣颠。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓尽纽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親童漩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弄贿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)矫膨,斷路器差凹,智...
    卡卡羅2017閱讀 134,720評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)期奔、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,126評(píng)論 4 61
  • Swift 介紹 簡(jiǎn)介 Swift 語言由蘋果公司在 2014 年推出危尿,用來撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,239評(píng)論 3 25
  • “沒能力弥搞,自己去學(xué)習(xí) 沒人脈邮绿,自己去勾搭 沒渠道,自己去建立 千萬不要把自己的前途攀例,建立在任何人身上船逮。“ 以上幾句...
    小小故事大智慧閱讀 471評(píng)論 0 0
  • 我把公寓套房租給王女士粤铭。我的套房一房一廳挖胃,簡(jiǎn)單裝修,已經(jīng)使用了好幾年了梆惯,又正好處在大樓的設(shè)計(jì)死角酱鸭,房間呈三角形,因...
    陳旭山閱讀 635評(píng)論 7 9