如何在 Swift 中的框架内创建委托/回调? [复制]

Posted

技术标签:

【中文标题】如何在 Swift 中的框架内创建委托/回调? [复制]【英文标题】:How to create delegate/callback inside framework in Swift? [duplicate] 【发布时间】:2019-11-06 06:26:44 【问题描述】:

我一直在实现登录框架以用于应用程序开发。我已经创建了登录框架功能,它工作正常。

现在我正在尝试回调从应用程序到框架的成功或失败的返回响应,以及从框架到应用程序。

这是我的框架代码:

   public func loginApiCall(username: String?, password: String?) 


    let parameters = [
        "username": username,
        "password": password
        ]
    print(parameters)

    let url = "apiUrl/authentication/"
    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: [:]).responseJSON 
        response in
        switch (response.result) 
        case .success:
            print(response)
            break
        case .failure:
            print(Error.self)
        
    

  

这是我使用 myframework 的示例应用程序:

    override func viewDidLoad() 
    super.viewDidLoad()

    //framework called here...
    let apiCall = APICall.init()
    apiCall.loginApiCall(username: "demo", password: "demo")

//viewdidload

【问题讨论】:

有什么问题,将完成块作为loginApiCall 函数的参数,并响应对应用程序的切换响应来执行它 【参考方案1】:

你可以使用回调来实现

//框架代码

public func loginApiCall(username: String?, password: String?, callback : @escaping ((Bool) -> Void)) 

    let parameters = [
        "username": username,
        "password": password
    ]
    print(parameters)

    let url = "apiUrl/authentication/"
    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: [:]).responseJSON 
        response in
        switch (response.result) 
        case .success:
            callback(true)
        case .failure:
            callback(false)
        
    


// viewDidLoad 代码

 override func viewDidLoad() 

super.viewDidLoad()
//framework called here...
let apiCall = APICall.init()
    apiCall.loginApiCall(username: "demo", password: "demo")  (status) in
        print("code")
    


//注意:根据您的要求创建completionHandler,它是一个演示completionHandler

【讨论】:

success 的情况下不需要breakbreak 默认添加。 @SGDev 回调和委托有什么区别 它显示错误转义闭包捕获框架中的非转义参数“回调” 查看我更新的代码,添加@escaping关键字 如何将响应数据返回给示例应用【参考方案2】:

首先你必须定义完成处理程序,然后你可以在你的函数参数中使用它。我建议您检查完成以轻松实现。

typealias DownloadComplete = () -> ()

public func loginApiCall(用户名: String?, 密码: String?, 完成: @escaping DownloadComplete)) 让参数= [ “用户名”:用户名, “密码”:密码 ] 打印(参数)

let url = "apiUrl/authentication/"
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: [:]).responseJSON 
    response in
    switch (response.result) 
    case .success:
        completed().  // important part
    case .failure:

    

【讨论】:

以上是关于如何在 Swift 中的框架内创建委托/回调? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

swift 2:与objective-c相比,推送通知没有委托回调

没有在 NSObject 类 ios swift 中获取委托方法的回调

如何在同一框架内访问 Objective-C 中的内部 Swift 类?

如何使用swift获取appdelegate中的当前位置

MonoTouch - UIView.Animate 完成回调未在按钮 touchUpInside 委托内调用

如何在swift中等待ui委托