【发布时间】:2017-03-28 18:37:19
【问题描述】:
我是一个快速的初学者,所以要温柔......
我在将函数分配为参数时遇到问题。
我已经定义了这个结构:
struct dispatchItem {
let description: String
let f: ()->Void
init(description: String, f: @escaping ()->()) {
self.description = description
self.f = f
}
}
我在一个名为 MasterDispatchController 的类中使用它,如下所示:
class MasterDispatchController: UITableViewController {
let dispatchItems = [
dispatchItem(description: "Static Table", f: testStaticTable),
dispatchItem(description: "Editable Table", f: testEditableTable)
]
func testEditableTable() {
//some code
}
func testStaticTable() {
//some code
}
等等
然后我的代码中有一个表格视图,它分派给单击的任何函数(我在上面的代码中显示的不仅仅是两个,但这并不重要)就像这样
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
dispatchItems[indexPath.row].f()
}
所以...编译器对此并不满意。它说当我定义 dispatchItems let 语句时:
无法将类型 '(MasterDispatchController) -> () -> ()' 的值转换为预期的参数类型 '() -> ()'
我想......好吧......我不确定我是否完全理解这一点,但编译器似乎想知道回调函数将来自哪个类。我明白为什么它可能需要它。所以我有点盲目地遵循编译器给我的模式,并将我的结构更改为:
struct dispatchItem {
let description: String
let f: (MasterDispatchController)->()->Void
init(description: String, f: @escaping (MasterDispatchController)->()->()) {
self.description = description
self.f = f
}
}
编译器很高兴,但现在当我尝试使用 dispatchItems[indexPath.row].f() 调用该函数时,它会说:
调用中缺少参数#1
该函数没有参数,所以我很困惑......
我想也许它是在向我询问有问题的对象的实例,这会有些意义......在我的例子中这将是“自我”,所以我尝试了dispatchItems[indexPath.row].f(self),但后来我得到了一个错误:
表达式解析为未使用的函数
所以我有点卡住了。
对不起,如果这是一个愚蠢的问题。感谢您的帮助。
【问题讨论】:
-
所有这些代码背后的想法是什么?因为它可能是你做错了。
-
我几乎可以肯定做错了。 :)
-
这是我学习 iOS 和 Swift 的测试应用。我有一个表格视图,里面有大量的小测试。例如,在一个小测试中,我制作了一个展示自定义绘图视图的新视图控制器。在另一个我尝试制作一个集合视图。基本上我正在编写一个大型应用程序,我在其中尝试了很多不同的事情。这段代码是调用所有这些小测试的调度程序。在运行时,当我单击表格元素时,我会运行那个有问题的小测试。
-
如果您刚刚开始和测试,那么只需使用
switch indexPath.row {case 0: callFunc1() case1: callFunc2() default: CallSomeDefault()}并调用您需要的函数即可。因为将函数传递给模型是错误的。 -
嗯,这就是我正在做的事情......我对我有多个 switch 语句正在进行这一事实感到恼火。一个是我显示表格文本的地方,另一个是我分派给函数的地方。我想把这个逻辑放在一个地方(因此是 dispatchItems 数组)。