Swift3 从协议到viewcontroller的访问方法

Swift3 从协议到viewcontroller的访问方法,swift3,protocols,Swift3,Protocols,我只是实现对象类来访问方法和协议。跟随 import UIKit import Foundation import Alamofire import SVProgressHUD protocol ParseAPIProtocol:class { func APIresponse(responseDict: NSDictionary) } class ParseAPI :NSObject{ // weak var mydelegate : MyProtocols?

我只是实现对象类来访问方法和协议。跟随

import UIKit
import Foundation
import Alamofire
import SVProgressHUD


protocol ParseAPIProtocol:class {
    func APIresponse(responseDict: NSDictionary)
}

class ParseAPI :NSObject{

      // weak var mydelegate : MyProtocols?
    weak var delegateAPI:ParseAPIProtocol?

    class func ParseUrl(postparameters: [String: AnyObject]!, url:String, current:UIViewController) {
        print(postparameters)

        print(url)
        SVProgressHUD.show()
        Alamofire.request(url, method: .post, parameters: postparameters, encoding: URLEncoding.default, headers: nil).responseJSON
            {
                (response:DataResponse<Any>) in
                switch(response.result)
                {
                case .success(_):
                    if response.result.value != nil
                    {
                        let  jsonResult = (try! JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary
                        print(jsonResult)

                    }
                    break

                case .failure(_):
                    SVProgressHUD.dismiss()
                    print(response.result.error as Any)
                    break
                }
             }
    }
导入UIKit
进口基金会
进口阿拉莫菲尔
导入SVProgressHUD
协议解析协议:类{
func APIresponse(响应指令:NSDictionary)
}
类ParseAPI:NSObject{
//弱var mydelegate:MyProtocols?
弱var delegateAPI:ParseAPI协议?
类func ParseUrl(后参数:[String:AnyObject]!,url:String,current:UIViewController){
打印(后参数)
打印(url)
SVProgressHUD.show()
请求(url,方法:.post,参数:postparameters,编码:URLEncoding.default,头:nil).responseJSON
{
(响应:DataResponse)在
开关(response.result)
{
成功案例:
如果response.result.value!=nil
{
将jsonResult=(try!JSONSerialization.jsonObject(with:response.data!,options:JSONSerialization.ReadingOptions.mutableContainers))设为!NSDictionary
打印(jsonResult)
}
打破
案例.失败(uu):
SVProgressHUD.disclose()
打印(response.result.error,如有)
打破
}
}
}
每当我得到jsonResult时,我只想调用fun APIresponse将结果字典解析到viewcontroller类

我在viewcontroller及其委托上声明了该方法

但当我尝试调用协议方法时,它不允许我访问该方法。可能是我做错了什么。请检查我的方法


谢谢!

在我看来有几个问题,尽管很难说,因为您没有在视图控制器中显示相关代码 (如何设置委托,如何调用解析API)

首先,您从不调用带有结果的代理。在当前的设置中,这甚至是不可能的:您定义
ParseAPI
来具有 委托(实例)成员,但将
ParseUrl
定义为一个类func。我想这就是你说“它不给我访问该方法的权限”时的意思。 尝试将其定义为成员函数,然后在成功的情况下调用委托:

self.delegateAPI?.APIresponse(responseDict: jsonResult)
在视图控制器中,实例化
ParseAPI
实例并使其保持活动状态(例如,将其存储在强实例成员中),设置其委托, 并调用
ParseUrl(…)
。此调用将立即返回,稍后处理请求和响应时,您的委托方法将返回 被叫来

class ViewController: UIViewController, ParseAPIProtocol
{
    var parser: ParseAPI?

    func somewhere()
    {
        self.parser = ParseAPI()
        self.parser!.delegateAPI = self
        self.parser!.ParseUrl(postparameters: [:], url: "...", current: self)
    }

    func APIresponse(responseDict: NSDictionary)
    {
        print("VC got response:", responseDict)
    }
}
其次,
current
参数从未使用过,您可以删除它。或者您可以删除整个委托内容并替换当前参数 通过回调,类似于以下内容:

func ParseUrl(postparameters: [String: AnyObject]!, url:String, finished: @escaping (_ response: NSDictionary?) -> Void)
{
    ...
    // success case:
    finished(jsonResult)
    // failure case:
    finished(nil)
}
self.parser!.ParseUrl(postparameters: [:], url: "...", finished: { (response: NSDictionary?) in
    // handle response
})
这样称呼它:

func ParseUrl(postparameters: [String: AnyObject]!, url:String, finished: @escaping (_ response: NSDictionary?) -> Void)
{
    ...
    // success case:
    finished(jsonResult)
    // failure case:
    finished(nil)
}
self.parser!.ParseUrl(postparameters: [:], url: "...", finished: { (response: NSDictionary?) in
    // handle response
})
您还可以将回调定义为具有错误参数,以便在出现错误时采取相应的行动


最后,虽然我不知道
SVProgressHUD
,但您可能需要调用
SVProgressHUD.discouse()
在成功案例中也是如此。

但是当我尝试调用协议方法时,它没有给我访问该方法的权限,这是什么意思?当我尝试像delegateAPI.APIresponse这样的方法时,它不起作用。您在调用该方法时设置了委托,所以您为该类设置委托的代码。先生,我已经共享了照片,您可以检查k它没有授予调用被委派者的权限您的代码完成建议看起来它仍然是一个类函数。您需要将
class func ParseUrl(…)
更改为
func ParseUrl(…)
。现在它授予我访问调用函数的权限,该函数在ViewController中声明,但从未调用过;(你说的是哪个函数?流程应该与我在
somewhere()
函数中所做的类似:视图控制器创建一个解析器,存储它,将自己设置为委托,并调用解析器的
ParseUrl(…)
函数。这将调用委托的
apirection(responseDict:)
函数(视图控制器)如果您将类似于
self.delegateAPI?.apResponse(responseDict:jsonResult)
的内容添加到解析器中。当然,您仍然需要调用
somewhere()
某个地方,例如在ViewDidDisplay(动画:)中或点击按钮时,这取决于您何时需要数据.self.delegateAPI?.apResponse(responseDict:jsonResult)之后,控件不会转到func-apisresponse(responseDict:NSDictionary){print(“VC得到响应:,responseDict)this-method}