我正在尝试使用闭包作为回调机制将所选数据从子视图控制器发送到父视图控制器。在具有四个下拉菜单的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
以上是我到目前为止尝试过的
将clouser更改为此:
var completionHandler:((Roles) -> Void)?
然后您可以通过这种方式调用它:
childEditTaskViewController?.completionHandler = { role in
// print("text = \(text)")
strSelectedValue = role.roleName // or role. roleContent
}
更新:我这样做是因为我也必须返回结果
var completionHandlerRol : ((Roles) -> ())?
正如@ 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)
})
希望这会有所帮助。编码愉快:)