Swift - 委托协议结构

Posted

技术标签:

【中文标题】Swift - 委托协议结构【英文标题】:Swift - Delegate Protocol structure 【发布时间】:2016-01-22 03:51:05 【问题描述】:

请原谅我对 swift 还很陌生。我想创建一个用于“发布”请求并从服务器获取响应的委托。然后将从服务器返回的参数传递给 func 并允许我的主类做出相应的响应。下面是我的代表和我的主要课程。它没有在 LoginViewController 类中打印出响应日志。我有点迷茫,也不知道哪里出了问题。非常感谢有关如何使其工作或更好地执行此操作的建议/指示。谢谢!

委托类

import Alamofire

protocol ServletDelegate 

   func responseSuccess(sender: Servlet, respArray : [String])

   func responseFail(sender: Servlet, respArray : [String])
 

class Servlet : UIViewController

    var delegate:ServletDelegate?

    //form 'data' parameter


    Alamofire.request(.POST, Config.flURL, parameters:["data" : ""]).responseData 
      response in
        print ("request \(response.request)")
        print ("response \(response.response)")
        print ("result \(response.result)")
        print ("data \(response.data)")

        let responseData = NSString (data: response.data!, encoding: NSUTF8StringEncoding)
        result = (responseData?.componentsSeparatedByString("~z0@"))!

        print("responseData :\(responseData)");
        print("result :\(result)");

        self.delegate?.responseSuccess(self, respArray: result);


主类

class LoginViewController: Servlet, UITextFieldDelegate, ServletDelegate 

    @IBAction func submitBtnAction(sender: UIButton) 

        Servlet().LoginUserHttp(tfUsername.text!, userPassword: tfPassword.text!);

    

    func responseSuccess(sender: Servlet, respArray: [String]) 
        print("responseSuccess: \(respArray)");
    

    func responseFail(sender: Servlet, respArray: [String]) 
        print("responseFail: \(respArray)");
    


【问题讨论】:

这里有几件事你做错了。原因之一是您没有通过LoginViewController 作为Servlet 中的代表。还要考虑让你的协议确认类协议,这样你的委托就不会被强引用(否则会阻止它被释放)。 感谢您指出这一点。 【参考方案1】:

首先,您的 servlet 类不应该是 UIViewController,其次 - 不要使用;在 swift 中它是多余的,第三个你没有设置委托,第四个是的委托应该很弱,这样你就不会遇到强 ref 循环,第五个我看不出有理由通过发件人

顺便说一句,您可能应该通过响应失败委托传递一些错误对象,但这取决于您

委托类

import Alamofire

protocol ServletDelegate: class 

   func responseSuccess(respArray : [String])

   func responseFail(respArray : [String])
 

class Servlet 

    weak var delegate:ServletDelegate?

    //form 'data' parameter


    Alamofire.request(.POST, Config.flURL, parameters:["data" : ""]).responseData 
      response in
        print ("request \(response.request)")
        print ("response \(response.response)")
        print ("result \(response.result)")
        print ("data \(response.data)")

        let responseData = NSString (data: response.data!, encoding: NSUTF8StringEncoding)
        result = (responseData?.componentsSeparatedByString("~z0@"))!

        print("responseData :\(responseData)")
        print("result :\(result)")

        self.delegate?.responseSuccess(respArray: result)


主类

class LoginViewController: UIViewController, UITextFieldDelegate, ServletDelegate 


let servlet = Servlet()

@IBAction func submitBtnAction(sender: UIButton) 

/// im guessing you know what you are doing here, because we dont see that LoginUserHttp in your Servlet code        
servlet.LoginUserHttp(tfUsername.text!, userPassword: tfPassword.text!)

    
override func viewDidLoad() 
    servlet.delegate = self


func responseSuccess(respArray: [String]) 
        print("responseSuccess: \(respArray)")
    

    func responseFail(respArray: [String]) 
        print("responseFail: \(respArray)")
    


【讨论】:

感谢您指出我的错误。我尝试了您的解决方案,效果很好。

以上是关于Swift - 委托协议结构的主要内容,如果未能解决你的问题,请参考以下文章

翻译: Swift 中的委托保留周期 如何在“纯”Swift(没有@objc)中进行弱协议引用

Swift使用委托实现多个协议

Swift 中不调用协议委托方法

Swift 协议委托返回 nil

在 Swift 上委托 Objective-C 协议

Swift 4.2:无法让简单的委托协议工作