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 - 委托协议结构的主要内容,如果未能解决你的问题,请参考以下文章