【发布时间】:2021-11-28 08:32:57
【问题描述】:
我是一名开始学习 iOS 的 Android 开发人员。我正在尝试在主从样式应用程序之间传递数据。
我得到了controller1,它有一个ToDo 项目列表,controller2 允许创建一个新的ToDo 项目并将其添加到controller1 的列表中。
我已经创建了一个协议:
protocol ListDataHolder {
associatedtype T
func addItem(item: T)
func reloadData()
}
在prepare 的controller1 中分配了self:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller2 = segue.destination as? Controller2{
controller2.toDoDataHolder = self
}
}
controller2 中声明的委托
// how do I tell to use ToDo class for generic type here
var toDoDataHolder: ListDataHolder? = nil
并像这样使用它:
@IBAction func onAddClicked(_ sender: Any) {
let toDo = ToDo()
...
toDoDataHolder?.addItem(item: toDo)
toDoDataHolder?.reloadData()
navigationController?.popViewController(animated: true)
}
我在走这条路时遇到了一些错误:
委托声明:
Protocol 'ListDataHolder' can only be used as a generic constraint because it has Self or associated type requirements
使用addItem()时:
Cannot convert value of type 'ToDo' to expected argument type 'ListDataHolder.T'
Insert ' as! ListDataHolder.T'
Member 'addItem' cannot be used on value of protocol type 'ListDataHolder'; use a generic constraint instead
当我从协议中删除泛型并只拥有addItem(item: ToDo) 时,一切正常。但我希望能够将ListDataHolder 用于任何数据类型。
这对我来说只是实验,我不是在寻找在控制器之间传递数据的正确方法。
编辑:您可以在此 GitHub 存储库中找到完整代码:github.com/Sermilion/ios_learning
【问题讨论】:
-
你能通过 GitHub 分享一个小的演示项目吗?我对您的描述有点困惑,无法自行复制
-
@Igor 嘿,Igor,我创建了一个公共仓库并将代码推送到那里:github.com/Sermilion/ios_learning
标签: ios swift uiviewcontroller protocols