编辑
https://www.someurl.com/search?&access_token=1,84,848473938;848483,83&_json={"key1":"value1","key2":"value2"}
当声明一个包含 JSON 字符串的 URL 时,我显然需要使用大括号 _json={ }
和 qoutes \"key1\":\"value1\"
NSURL(string: String)
,但是,如果这些字符中的任何一个包含在字符串中,就会神奇地变为 nil
。
所以在这里正确回答:NSURL is returning nil for a valid URL ,我尝试使用:
let url = NSURL(string: url.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)
但我认为它已被弃用,因为它是在 Swift 2 发布之前出现的,我收到错误:无法将类型 NSCharacterSet 的值转换为预期的参数类型 NSStringEncoding(又名 UInt)
所以我尝试使用
let url = NSURL(string: url.stringByAddingPercentEncodingWithAllowedCharacters(NSUTF8StringEncoding)!)!
虽然这确实允许 NSURL 有一个值而不是 nil,但它没有返回预期的结果,所以仍然有问题。
我知道格式是正确的,因为如果我在浏览器中手动输入 URL 字符串,我会得到预期的结果。如果我从 Xcode 复制/粘贴编码版本,它会给我错误的结果,就像 Swift 在编码时如上所示。
如有任何见解,我们将不胜感激。
最佳答案
您可以修改可变字符集以删除允许的字符:由于您希望对逗号进行编码,因此在使用它之前从 URLQueryAllowedCharacterSet
中删除逗号。
在 Swift 2 中,我们需要像这样与 NSMutableCharacterSet
共舞:
let sourceURL = "https://www.someurl.com/search?&access_token=1,84,848473938;848483,83&_json={\"key1\":\"value1\",\"key2\":\"value2\"}"
let charSet = NSMutableCharacterSet()
charSet.formUnionWithCharacterSet(NSCharacterSet.URLQueryAllowedCharacterSet())
charSet.removeCharactersInString(",")
let url = NSURL(string: sourceURL.stringByAddingPercentEncodingWithAllowedCharacters(charSet)!)
print(url!)
打印:
为了对 Swift 3 做同样的事情,我们使用 CharacterSet
结构而不是 NSMutableCharacterSet
但它的想法是一样的:
var charSet = CharacterSet()
charSet.formUnion(.urlQueryAllowed)
charSet.remove(",")
if let encoded = sourceURL.addingPercentEncoding(withAllowedCharacters: charSet) {
if let url = URL(string: encoded) {
print(url)
}
}
关于swift - 为什么 NSURL 不接受包含引号或大括号的有效字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806737/