Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Swift 3中的任务中提取值_Swift - Fatal编程技术网

从Swift 3中的任务中提取值

从Swift 3中的任务中提取值,swift,Swift,我在尝试解析Swift 3中的简单网站时遇到问题。我合并了我在这个网站上找到的内容,但仍然无法从其他函数中提取loginText,并且得到了一个“实例成员不能用于..”。。尝试将所有内容放入类时键入“error” import Foundation import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true extension String { func slice(from: Stri

我在尝试解析Swift 3中的简单网站时遇到问题。我合并了我在这个网站上找到的内容,但仍然无法从其他函数中提取loginText,并且得到了一个“实例成员不能用于..”。。尝试将所有内容放入类时键入“error”

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)
谢谢

我抓到你了

您碰巧使用了错误的loginText

您调用了completionHandler字符串loginText,同时在函数外部声明了loginText

但你走的路是对的

如果调用self.loginText,您的问题将得到解决,请查看以下内容:

 getToken {
    loginText in //you named it loginText
    self.loginText.slice(from: "LT", to: "1s1")
    print("View Controller: \(loginText)")
}
问题是,这仍然没有被调用。因为您从未调用过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,我将删除它。但即使是这样,我还是建议只使用一个接受字符串的函数,而不是在字符串外部声明它。但是你知道为什么你需要它,如果你这样做的话-是的。干杯

编辑:您似乎还缺少@escaping


您甚至没有在任务的完成处理程序中调用completionHandler。错误究竟发生在哪里?请详细说明您的问题,并解决这些问题。我很抱歉。我必须承认,我现在真的不太明白我在做什么。我只是想实现我在python中使用请求所做的事情,而您在这里看到的是3个小时的尝试和大量错误的结果。我所要做的就是获取loginText,以便能够在getToken之外使用它。非常感谢!然而,我得到一个错误:当按照建议使用completionHandler时,使用非转义参数“completionHandler”的闭包可能允许它转义…您使用的是swift 3吗?是的!我刚刚通过在完成处理程序中添加@espacing解决了这个问题。非常感谢。是的,我刚刚编辑了我的答案,包括:。若你们能把这个问题标记为正确,那个就太棒了;但是,如何让viewDidLoad返回“textLogin”?
func getToken(completionHandler: @escaping (String) -> () ) {}