Swift中URL處理中的注意點

平常的開發當中,網絡請求是不可或缺的。而在網絡訪問請求中,常常會遇到有中文空格字符的狀況,直接用這些字符串去訪問是沒法正常訪問,須要咱們作進一步的處理。html

通常處理

let urlString = "http://10.0.3.86/中文/main.html#/help"
複製代碼

好比以上的url,想使用webview進行訪問或者是原生髮起http請求,都須要進行轉碼處理。 有人會問,這有什麼難的?拿起鍵盤就是幹 前端

就是幹.png

OC:
NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

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

複製代碼

一敲代碼,emmmmm~~ Xcode發警告了,該方法已通過期,用下面的方法替代,因而緊接着:web

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

Swift:
let encodedString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
複製代碼

OK,轉碼處理一下,再訪問轉碼以後的url。 what?仍是不能正常訪問? 咱們來看看轉碼以後的url是什麼: swift

image.png
原來是由於最後的#被轉碼成了%23 前端開發的小夥伴說這個#不能動,只能咱們不轉碼。不轉碼那麼夾雜中文字符怎麼辦呢?—— 修改參數因此咱們的需求變化成:除了url裏面的#不動,其餘該轉碼的都轉碼

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

如上手動修改轉碼參數,OK 能夠了。 Swift如法炮製bash

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

雖然語言不同,可是思路同樣。emmmm...你會驚人的發現,根本無論用!!! 網絡

wc.png

緣由分析

問題是出在let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet這一行,在swift語言中,Foundation框架中的不少class都從新用struct重寫了,好比NSString和String,NSUrl和URL,若是要使用相似於OC一些特性,有時候須要as來強轉成對應的NS開頭的類。強轉的過程當中,CharacterSet應該轉成NSCharacterSet,而不該該是NSMutableCharacterSet,也就是說子類指針指向了父類對象,父類裏面沒有子類的方法,因此執行charSet.addCharacters(in: "#")的時候,沒法正確添加。框架

Swift正確的寫法

順着緣由一路分析,應該這麼寫:ui

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

固然還有其餘寫法:url

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

方法一和二本質是同樣的,其實沿用的OC的思想,先構造一個可變對象,再加入自定義的字符。若是要像OC這麼搞,那麼蘋果設計swift的意義何在?換句話說,swift用結構體寫重寫這個類必定考慮到這個問題,那就應該有相應的處理方法。spa

查閱官方文檔吧,少年!

image.png
果不其然,找到一個方法,用來插入字符。 因此還有第三種寫法:

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

咱們來看一下最終結果

結果.png
OK,符合需求!
相關文章
相關標籤/搜索