Class 理解:void 函数中的意外非 void return 值 (swift 3)

Class understanding: Unexpected non-void return value in void function (swift 3)

我想弄清楚 类 在 swift 中是如何工作的。 我已经阅读了关于 dev.apple 的 类 文档,但可能有一些我不理解的重要内容。感谢您的帮助,如果可能,请说明这是如何工作的。

当 运行 getData.connect

时,我无法从该函数 return json 对象

错误:getData.swift:39:20: Unexpected non-void return value in void function

import UIKit
import Alamofire
import SwiftyJSON

public class getData: NSObject {
    public func connect(url: String, devhostname: String, hostname: String, username: String, password: String) -> Array<JSON> {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            hostname: .pinCertificates(
                certificates: ServerTrustPolicy.certificates(),
                validateCertificateChain: false,
                validateHost: true
            ),
            devhostname: .disableEvaluation
        ]

        let sessionManager = Alamofire.SessionManager(
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )

        var headers: HTTPHeaders = [:]

        if let authorizationHeader = Request.authorizationHeader(user: username, password: password) {
            headers[authorizationHeader.key] = authorizationHeader.value
        }

        sessionManager.request(url, headers: headers).responseJSON { response in

            let data = response.data!
            let json = JSON(data: data)

            return json

            sessionManager.session.invalidateAndCancel()
        }
    }
}

您的方法必须 return 一个 Array<JSON> 对象:

public func connect(url: String, devhostname: String, hostname: String, username: String, password: String) -> Array<JSON>

但是这段代码是异步执行的:

sessionManager.request(url, headers: headers).responseJSON { response in

    let data = response.data!
    let json = JSON(data: data)

    return json

    // this line is never executed too..
    sessionManager.session.invalidateAndCancel()
}

因此,您的方法永远不会 return 预期的数组。您必须从方法声明中删除 return 语句并使用 Protocols/Listeners 或 CompletionHandlers.

管理异步响应

.responseJSON 是异步的,您不能只 return 您的数据到调用函数或在 .responseJSON 回调中使用 return 从函数中取出数据。

您可以删除 return 类型的 connect 函数,并使用 [JSON] -> Void.

类型的回调返回 return 数据