【问题标题】:Alamofire: Cannot call value of non-function type 'NSHTTPURLResponse?'Alamofire:无法调用非函数类型“NSHTTPURLResponse”的值?
【发布时间】:2016-10-03 11:37:00
【问题描述】:

我在一个名为 APIManager 的类上有一个扩展:

import Alamofire
import Foundation

// MARK: - Logout
extension APIManager {

    public func performLogout() {
        let request = defaultManager.request(APIManager.Router.Logout.URLRequest)

        request.response( // ERROR ON THIS LINE AS NOTED BELOW
            queue: APIManager.responseQueue,
            responseSerializer: Request.stringResponseSerializer(),
            completionHandler: { [weak self] (response)  in
                guard let strongSelf = self else { return }

            }
        )
    }

}

当扩展包含在 SAME FILE 中的 APIManager 类下时,没有任何问题。

但是,当我将扩展名移到新文件中时,我收到以下错误:

不能调用非函数类型'NSHTTPURLResponse?'的值

很明显,当扩展名放在另一个文件中时,编译器会将上面定义的 Alamofire/ResponseSerialization.swift 方法与 Alamofire Request 类的 Alamofire/Request.swift 中的 'response' 属性混淆

APIManager 类如下:

public final class APIManager {

  // MARK: - Singleton shared instance
  static let sharedInstance = APIManager()

  let defaultManager: Alamofire.Manager = {
    let serverTrustPolicies: [String: ServerTrustPolicy] = [

        "TBD1": .PinCertificates(
            certificates: ServerTrustPolicy.certificatesInBundle(),
            validateCertificateChain: true,
            validateHost: true
        ),

        "TBD2": .DisableEvaluation
    ]

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders

    return Alamofire.Manager(
        configuration: configuration,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
  }()
}

这里有一个类似的问题,但不太一样:

Cannot call value of non-function type 'NSHTTPURLResponse?' Alamofire ObjectMapper

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    如您所说,如果这在其他文件中运行良好,请想到一些建议。

    • 将要扩展的类标记为公开。 (Swift 类默认是内部的。)
    • 打开类右侧的文档检查器窗格,确保您的目标成员资格包括您正在编译的目标。

    如果您的问题仍然存在,请告诉我,我会进一步调查。

    【讨论】:

    • 谢谢@Jacob - 我已经验证这两个条件都成立,但问题仍然存在。
    • 我还包含了原来的 APIManager 类。
    • 尽管 APIManager 被标记为公共,但其中的一些结构被标记为私有。这就是问题所在。
    • 啊,有道理。很高兴您找到了解决方案。
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2018-03-16
    • 2017-08-16
    • 2020-02-01
    • 2021-01-15
    • 2021-03-30
    相关资源
    最近更新 更多