【问题标题】:Closure for call back by using Generics to pass struct as parameter通过使用泛型将结构作为参数传递来关闭回调
【发布时间】:2020-02-13 14:06:40
【问题描述】:

我正在尝试使用闭包作为回调机制将选定的数据从子视图控制器发送到父视图控制器。在具有四个下拉菜单的 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"

}
}

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

// 父视图控制器

childEditTaskViewController?.completionHandler = { text in

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

错误:

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

以上是我目前尝试过的

【问题讨论】:

  • 看起来你正在传递一个角色,你的意思是 'myRoless[indexPath.row].角色名'?
  • @WelcomeNewUsers 想在索引处返回整个项目,索引处有字典

标签: ios swift xcode generics codable


【解决方案1】:

把你的clouser改成这样:

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

那么你可以这样调用它:


childEditTaskViewController?.completionHandler = { role in

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

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

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

【讨论】:

  • 我认为这是一个不完整的答案@Mac3n。是“var completionHandler:((String) -> Int)?”正确
  • 其次,我需要在这里使用泛型,以便使用相同的代码可以传递多个结构。
  • 变量和表达式不能是通用的。只有泛型函数和泛型类型。
  • 我是这样做的:“var completionHandlerRol : ((Roles) -> ())?”因为我也想返回结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2014-04-23
  • 1970-01-01
  • 2019-02-27
  • 2020-03-26
  • 2019-03-05
  • 2020-10-25
相关资源
最近更新 更多