Ios 格式化URLComponents queryItems字符串时遇到问题

Ios 格式化URLComponents queryItems字符串时遇到问题,ios,swift,Ios,Swift,我正在从url参数获取代码,并尝试将其存储在变量中,以便在其他地方使用该代码 var codeParam: URLQueryItem? override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let key = change?[NSKe

我正在从url参数获取代码,并尝试将其存储在变量中,以便在其他地方使用该代码

var codeParam: URLQueryItem?

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if let key = change?[NSKeyValueChangeKey.newKey] {
            print("URL \(key)")

            let components = URLComponents(url: key as! URL, resolvingAgainstBaseURL: false)
            print("COMPONETS \(String(describing: components?.queryItems))")

            if let queryItems = components?.queryItems {
              codeParam = queryItems.first { $0.name == "code" }
            }

            print(codeParam?.value!)
}
当前代码打印出来

可选(“jcnribc2espoy40rm6mep2pucly4h”)

但我只需要打印


jcnribc2espoy40rm6mep2pucly4h

我会使用以下内容:

扩展URL{
var代码项:字符串{
let components=URLComponents(url:self,resolvingAgainstBaseURL:false)
返回组件?.queryItems?.first(其中:{$0.name==“code”})?.value??“
}
}
它首先检查URL是否有效。 然后检查是否有任何查询项。 然后检查是否有名为“code”的查询项。 如果所有检查都成功,则返回值,否则返回空字符串

像这样使用它
myURL.code项目

如果要保留现有的代码,只需执行以下操作:


打印(codeParam?.value??)

我会使用类似的方法:

扩展URL{
var代码项:字符串{
let components=URLComponents(url:self,resolvingAgainstBaseURL:false)
返回组件?.queryItems?.first(其中:{$0.name==“code”})?.value??“
}
}
它首先检查URL是否有效。 然后检查是否有任何查询项。 然后检查是否有名为“code”的查询项。 如果所有检查都成功,则返回值,否则返回空字符串

像这样使用它
myURL.code项目

如果要保留现有的代码,只需执行以下操作:


打印(codeParam?.value??)
我找到了一个很好的方法,可以安全地打开它

guard let param = codeParam else { return }
guard let value = param.value else { return }
print(value)

我找到了一个很好的方法,把它拆开

guard let param = codeParam else { return }
guard let value = param.value else { return }
print(value)

你必须从可选的(codeParam,value)中解包值。你必须从可选的(codeParam,value)中解包值。我基本上已经这样做了,但不是在扩展中,我仍然在它中得到可选的(“”)。不,你没有。如果你像我那样做,你就不会有选择了。我更新了我的答案。我基本上已经这样做了,但不是在一个扩展中,我仍然得到可选(“”)在它不,你不是。如果你像我那样做,你就不会有选择了。我更新了我的答案。
guard let value=codeParam?.value-else{return}
guard let value=codeParam?.value-else{return}