类理解:void函数中出现意外的非void返回值(swift 3)

Posted

技术标签:

【中文标题】类理解:void函数中出现意外的非void返回值(swift 3)【英文标题】:Class understanding: Unexpected non-void return value in void function (swift 3) 【发布时间】:2016-10-12 09:39:21 【问题描述】:

我正试图弄清楚类是如何快速运行的。 我已经阅读了 dev.apple 上的类文档,但可能有一些我不明白的重要内容。感谢您的帮助,如果可能,请说明它应该如何工作。

运行 getData.connect 时,我无法从该函数返回 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()
        
    

【问题讨论】:

【参考方案1】:

您的方法必须返回一个Array&lt;JSON&gt; 对象:

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 语句,并使用协议/侦听器或 CompletionHandlers 管理异步响应。

【讨论】:

【参考方案2】:

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

您可以删除 connect 函数的返回类型,并使用 [JSON] -&gt; Void 类型的回调返回数据。

【讨论】:

以上是关于类理解:void函数中出现意外的非void返回值(swift 3)的主要内容,如果未能解决你的问题,请参考以下文章

如何停止返回导致“void函数中出现意外的非void返回值”?

Swift 1.2:void 函数中出现意外的非 void 返回值

void 函数中的意外非 void 返回值(swift)

void函数Swift3中的意外非void返回值

在嵌套函数中返回布尔值

void函数Swift 4中的意外非void返回值