从Swift 3

时间:2017-05-16 20:43:02

标签: swift

我在尝试解析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)

谢谢!

1 个答案:

答案 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) -> () ) {}