通过使用泛型传递struct作为参数来回叫

问题描述 投票:0回答:1

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

为了获得更多理解,代码低于我到目前为止尝试过的代码:

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

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

}
}

// ChildViewController

 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()
}

// ParentViewController

childEditTaskViewController?.completionHandler = { text in

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

错误:

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

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

ios swift xcode generics codable
1个回答
0
投票

将clouser更改为此:

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

然后您可以通过这种方式调用它:


childEditTaskViewController?.completionHandler = { role in

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

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

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

0
投票

正如@ Mac3n所说的,variables and expressions can't be generic是事实。您可以选择这样做。

func genericMethod<T>(type: T.Type,
          completion: ((T) -> Void)) {

    let roles = Roles() // Assuming you have the objects

    guard let roles = roles as? T else { return } // Cast objects to be generic
    completion(roles)
}

然后像这样使用它:

childEditTaskViewController.genericMethod(type: Roles.self, completion: { role in
    print(role.roleName)
})  

希望这会有所帮助。编码愉快:)

© www.soinside.com 2019 - 2024. All rights reserved.