Swift中URL處理中的注意點(diǎn)

日常的開發(fā)當(dāng)中,網(wǎng)絡(luò)請求是不可或缺的。而在網(wǎng)絡(luò)訪問請求中形用,經(jīng)常會(huì)遇到有中文空格字符的情況就轧,直接用這些字符串去訪問是無法正常訪問,需要我們做進(jìn)一步的處理田度。

一般處理

let urlString = "http://10.0.3.86/中文/main.html#/help"

比如以上的url妒御,想使用webview進(jìn)行訪問或者是原生發(fā)起http請求,都需要進(jìn)行轉(zhuǎn)碼處理镇饺。
有人會(huì)問乎莉,這有什么難的?拿起鍵盤就是干


就是干.png
OC:
NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Swift:
let encodedString = urlString.addingPercentEscapes(using: .utf8)

一敲代碼奸笤,emmmmm~~ Xcode發(fā)警告了惋啃,該方法已經(jīng)過期,用下面的方法替代监右,于是緊接著:

OC:
NSString* encodedString = [urtString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

Swift:
let encodedString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

OK,轉(zhuǎn)碼處理一下边灭,再訪問轉(zhuǎn)碼之后的url。
what健盒?還是不能正常訪問绒瘦?
我們來看看轉(zhuǎn)碼之后的url是什么:

image.png

原來是因?yàn)樽詈蟮?被轉(zhuǎn)碼成了%23
前端開發(fā)的小伙伴說這個(gè)#不能動(dòng),只能我們不轉(zhuǎn)碼扣癣。不轉(zhuǎn)碼那么夾雜中文字符怎么辦呢惰帽?—— 修改參數(shù)
所以我們的需求變化成:除了url里面的#不動(dòng)父虑,其他該轉(zhuǎn)碼的都轉(zhuǎn)碼

NSMutableCharacterSet *set  = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[set addCharactersInString:@"#"];
NSString *encodedString     = [urlSring stringByAddingPercentEncodingWithAllowedCharacters:set];

如上手動(dòng)修改轉(zhuǎn)碼參數(shù)该酗,OK 可以了。
Swift如法炮制

let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet
charSet.addCharacters(in: "#")
let encodingString = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)

雖然語言不一樣士嚎,但是思路一樣呜魄。emmmm...你會(huì)驚人的發(fā)現(xiàn),根本不管用@绸谩8浮!

wc.png

原因分析

問題是出在let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet這一行膳殷,在swift語言中操骡,F(xiàn)oundation框架中的很多class都重新用struct重寫了,比如NSString和String赚窃,NSUrl和URL册招,如果要使用類似于OC一些特性,有時(shí)候需要as來強(qiáng)轉(zhuǎn)成對應(yīng)的NS開頭的類勒极。強(qiáng)轉(zhuǎn)的過程中是掰,CharacterSet應(yīng)該轉(zhuǎn)成NSCharacterSet,而不應(yīng)該是NSMutableCharacterSet,也就是說子類指針指向了父類對象辱匿,父類里面沒有子類的方法键痛,所以執(zhí)行charSet.addCharacters(in: "#")的時(shí)候炫彩,無法正確添加。

Swift正確的寫法

順著原因一路分析絮短,應(yīng)該這么寫:

方法一:
let charSet = CharacterSet.urlQueryAllowed as NSCharacterSet
let mutSet = charSet.mutableCopy() as! NSMutableCharacterSet
mutSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: mutSet as CharacterSet)

當(dāng)然還有其他寫法:

方法二:
let charSet = NSMutableCharacterSet()
charSet.formUnion(with: CharacterSet.urlQueryAllowed)
charSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)

方法一和二本質(zhì)是一樣的江兢,其實(shí)沿用的OC的思想,先構(gòu)造一個(gè)可變對象丁频,再加入自定義的字符杉允。如果要像OC這么搞,那么蘋果設(shè)計(jì)swift的意義何在席里?換句話說叔磷,swift用結(jié)構(gòu)體寫重寫這個(gè)類一定考慮到這個(gè)問題,那就應(yīng)該有相應(yīng)的處理方法奖磁。

查閱官方文檔吧改基,少年!


image.png

果不其然咖为,找到一個(gè)方法秕狰,用來插入字符。
所以還有第三種寫法:

方法三:
var charSet = CharacterSet.urlQueryAllowed
charSet.insert(charactersIn: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet )

我們來看一下最終結(jié)果


結(jié)果.png

OK案疲,符合需求!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末麻养,一起剝皮案震驚了整個(gè)濱河市褐啡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳖昌,老刑警劉巖备畦,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異许昨,居然都是意外死亡懂盐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門糕档,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莉恼,“玉大人,你說我怎么就攤上這事速那±” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵端仰,是天一觀的道長捶惜。 經(jīng)常有香客問我,道長荔烧,這世上最難降的妖魔是什么吱七? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任汽久,我火速辦了婚禮,結(jié)果婚禮上踊餐,老公的妹妹穿的比我還像新娘景醇。我一直安慰自己,他們只是感情好市袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布啡直。 她就那樣靜靜地躺著,像睡著了一般苍碟。 火紅的嫁衣襯著肌膚如雪酒觅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天微峰,我揣著相機(jī)與錄音舷丹,去河邊找鬼。 笑死蜓肆,一個(gè)胖子當(dāng)著我的面吹牛颜凯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仗扬,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼症概,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了早芭?” 一聲冷哼從身側(cè)響起彼城,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎退个,沒想到半個(gè)月后募壕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语盈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年舱馅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刀荒。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡代嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缠借,到底是詐尸還是另有隱情资溃,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布烈炭,位于F島的核電站溶锭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏符隙。R本人自食惡果不足惜趴捅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一垫毙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拱绑,春花似錦综芥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至红省,卻和暖如春额各,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吧恃。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工虾啦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痕寓。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓傲醉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呻率。 傳聞我的和親對象是個(gè)殘疾皇子硬毕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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