我在尝试解析Swift 3中的一个简单网站时遇到了问题。我将在此网站上找到的内容合并,但仍无法从其他函数中提取loginText,并得到一个'实例成员无法使用在尝试将所有内容放入类中时出现..类型'错误。
import Foundation
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
extension String {
func slice(from: String, to: String) -> String? {
return (range(of: from)?.upperBound).flatMap { substringFrom in
(range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
substring(with: substringFrom..<substringTo)
}
}
}
}
var loginText = ""
func getToken(completionHandler: (String) -> () ) {
var request = URLRequest(url: URL(string: [MY URL])!)
request.httpMethod = "GET"
var loginText = ""
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
let task = session.dataTask(with: request) {data, response, err in
loginText = (String(data: data!, encoding: String.Encoding.utf8)!)
}
task.resume()
}
func viewDidLoad() {
getToken {
loginText in
loginText.slice(from: "LT", to: "1s1")
print("View Controller: \(loginText)")
}
}
print(viewDidLoad())
print(loginText)
谢谢!
答案 0 :(得分:1)
我找到了你。
您巧合使用了错误的loginText。
您调用了completionHandler字符串loginText,同时在函数外部声明了loginText。
但是你走的是正确的道路。
如果您调用self.loginText,请解决此问题:
getToken {
loginText in //you named it loginText
self.loginText.slice(from: "LT", to: "1s1")
print("View Controller: \(loginText)")
}
问题是,这个STILL永远不会被调用。因为你永远不会调用那个completionHandler,所以 - 忘掉self.loginText,因为你有一个只传递你的字符串的completionHandler。
使用此功能,甚至不更改getToken方法。它将被调用,并将正常工作:
let task = session.dataTask(with: request) {data, response, err in
let loginText = (String(data: data!, encoding: String.Encoding.utf8)!)
completionHandler(loginText)
}
如果您不想在getToken之外使用它,我也会删除var loginText = ""
。但即使你是,我建议只有一个函数接受String
,而不是在外面声明它。但你知道为什么你在外面需要它 - 所以是的。干杯
编辑:你似乎也错过了@escaping
func getToken(completionHandler: @escaping (String) -> () ) {}