首页 > 解决方案 > 通过使用泛型将结构作为参数传递来关闭回调

问题描述

我正在尝试使用闭包作为回调机制将选定的数据从子视图控制器发送到父视图控制器。在具有四个下拉菜单的 UI 中,使用了该子视图控制器。现在,在每个下拉菜单中,都会将一个结构模型类传递给它,其中包含它们各自的数据。所以现在,当将选定的数据传递回父视图时,需要使用他们尊重的结构类。

为了更多地理解代码,我到目前为止尝试过的代码如下:

struct Roles : Codable {
let roleId : Int?
let roleName, roleContent : String?

private enum Codingkeys: String, CodingKey
{
    case roleId = "roleId"
    case roleName = "roleName"
    case roleContent = "roleContent"

}
}

// 子视图控制器

 var myRoless = [Roles]()
 var completionHandler:((String) -> Int)?

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let result = completionHandler?(myRoless[indexPath.row])

    print("completionHandler returns... \(String(describing: result))")

    removeAnimate()
}

// 父视图控制器

childEditTaskViewController?.completionHandler = { text in

          //  print("text = \(text)")
            strSelectedValue = text
 }

错误:

Cannot convert value of type 'Roles' to expected argument type 'String

以上是我到目前为止尝试过的

标签: iosswiftxcodegenericscodable

解决方案


将您的 clouser 更改为:

var completionHandler:((Roles) -> Void)?

那么你可以这样调用它:


childEditTaskViewController?.completionHandler = { role in

      //  print("text = \(text)")
      strSelectedValue = role.roleName // or role. roleContent
 }

更新:我这样做是因为我也必须返回结果

var completionHandlerRol : ((Roles) -> ())?

推荐阅读