平常的開發當中,網絡請求是不可或缺的。而在網絡訪問請求中,常常會遇到有中文空格字符的狀況,直接用這些字符串去訪問是沒法正常訪問,須要咱們作進一步的處理。html
let urlString = "http://10.0.3.86/中文/main.html#/help"
複製代碼
好比以上的url,想使用webview進行訪問或者是原生髮起http請求,都須要進行轉碼處理。 有人會問,這有什麼難的?拿起鍵盤就是幹 前端
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
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...你會驚人的發現,根本無論用!!! 網絡
問題是出在let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet
這一行,在swift語言中,Foundation框架中的不少class都從新用struct重寫了,好比NSString和String,NSUrl和URL,若是要使用相似於OC一些特性,有時候須要as來強轉成對應的NS開頭的類。強轉的過程當中,CharacterSet應該轉成NSCharacterSet,而不該該是NSMutableCharacterSet,也就是說子類指針指向了父類對象,父類裏面沒有子類的方法,因此執行charSet.addCharacters(in: "#")
的時候,沒法正確添加。框架
順着緣由一路分析,應該這麼寫: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
查閱官方文檔吧,少年!
方法三:
var charSet = CharacterSet.urlQueryAllowed
charSet.insert(charactersIn: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet )
複製代碼
咱們來看一下最終結果