(XCode 6.3.2,Swift 1.2)
在整个晚上研究互联网之后,我已经知道这不可能轻易做到这一点
我只想获取YouTube链接的视频ID。所以“https://www.youtube.com/watch?v=ABCDE”中的“ABCDE”
到目前为止我得到了什么:
var url = "https://www.youtube.com/watch?v=ABCDE"
let characterToFind: Character = "="
let characterIndex = find(url, characterToFind)
println(characterIndex)
url.substringFromIndex(advance(url.startIndex, characterIndex))
Prinln输出:可选(31)
这是对的,但我不能使用它,因为它不是索引。
XCode还指出最后一行:呼叫中参数#3缺少参数
我也不知道substringFromIndex
的第三个参数是什么。
非常感谢提前!
答案 0 :(得分:4)
您可以使用NSURL查询属性,如下所示:
Xcode 8.3.1•Swift 3.1
let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = URL(string: link)?.query?.components(separatedBy: "=").last {
print(videoID) // "ABCDE"
}
另一个选择是使用 URLComponents :
let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = URLComponents(string: link)?.queryItems?.filter({$0.name == "v"}).first?.value {
print(videoID) // "ABCDE"
}
Swift 1.x
let link = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = NSURL(string: link)?.query?.componentsSeparatedByString("=").last {
println(videoID) // "ABCDE"
}
答案 1 :(得分:4)
Swift 3+版本:
var url = "https://www.youtube.com/watch?v=ABCDE"
if let videoID = url.components(separatedBy: "=").last {
print(videoID)
}
答案 2 :(得分:0)
您需要打开可选项才能使用索引:
var url = "https://www.youtube.com/watch?v=ABCDE"
let characterToFind: Character = "="
if let index = find(url, characterToFind) { // Unwrap the optional
url.substringFromIndex(advance(index, 1)) // => "ABCDE"
}
答案 3 :(得分:0)
使用您的网址格式,您可以获得' v'通过转换为NSURL然后获取参数并通过' ='将参数值分开。
var url: NSURL = NSURL(string: "https://www.youtube.com/watch?v=RAzOOfVA2_8")!
url.query?.componentsSeparatedByString("=").last
url.query
返回v=RAzOOfVA2_8
如果链接有多个参数,您可以获取所有参数,然后循环验证每个参数:
var url: NSURL = NSURL(string: "https://www.youtube.com/watch?v=RAzOOfVA2_8")!
var params = url.query?.componentsSeparatedByString("&")
if let _params = params { //have parameters in URL
for param in _params { //verify each pair of key & value in your parameters
var _paramArray = param.componentsSeparatedByString("=") //separate by '=' to get key & value
if (_paramArray.first?.compare("v", options: nil, range: nil, locale: nil) == NSComparisonResult.OrderedSame) {
println(_paramArray.last)
}
}
} else {
//url does not have any parameter
}
答案 4 :(得分:0)
find
返回一个可选项 - 因为可能找不到该字符,在这种情况下它将是nil
。您需要打开它以检查它不是并获得实际值。
您也可以直接在索引上使用基于范围的subscript
,而不是使用advance
将其转换为整数索引:
let url = "https://www.youtube.com/watch?v=ABCDE"
if let let characterIndex = find(url, "=") {
let value = url[characterIndex.successor()..<url.endIndex] // ABCDE
}
else {
// error handling, if you want it, here
}
如果在“未找到”的情况下存在合理的默认值,则有更多选项。例如,如果您只想在这种情况下使用空字符串,则可以使用:
let idx = find(url, "=")?.successor() ?? url.endIndex
let value = url[idx..<url.endIndex]
或者,也许您现在甚至不需要处理可选项,所以您也很乐意将结果保留为可选项:
// value will be Optional("ABCD")
let value = find(url, "=").map { url[$0.successor()..<url.endIndex] }
此外,您可能会发现信息here非常有用,而不是手工解析网址字符串。