OC:
NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Swift:
let encodedString = urlString.addingPercentEscapes(using: .utf8)
此方法已过期
OC:
NSString* encodedString = [urtString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
Swift:
let encodedString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
此方法会把**#被转码成了%23**
let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet
charSet.addCharacters(in: "#")
let encodingString = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)
问题是出在let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet这一行,在swift语言中,Foundation框架中的很多class都重新用struct重写了,比如NSString和String,NSUrl和URL,如果要使用类似于OC一些特性,有时候需要as来强转成对应的NS开头的类。强转的过程中,CharacterSet应该转成NSCharacterSet,而不应该是NSMutableCharacterSet,也就是说子类指针指向了父类对象,父类里面没有子类的方法,所以执行charSet.addCharacters(in: “#”)的时候,无法正确添加。
正确的写法
方法一:
let charSet = CharacterSet.urlQueryAllowed as NSCharacterSet
let mutSet = charSet.mutableCopy() as! NSMutableCharacterSet
mutSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: mutSet as CharacterSet)
方法二:
let charSet = NSMutableCharacterSet()
charSet.formUnion(with: CharacterSet.urlQueryAllowed)
charSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)
方法三:
var charSet = CharacterSet.urlQueryAllowed
charSet.insert(charactersIn: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet )