我对Swift 3函数调用有一些问题。以下是一个例子。
Old Swift:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell
斯威夫特3:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
上述语法没问题。但是现在Xcode向我显示了一个错误,并要求我这样做:
@objc(tableView:cellForRowAtIndexPath:) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
我不明白为什么我要声明@objc(tableView:cellForRowAtIndexPath:)
。
只有在我尝试在扩展下实现表视图数据源方法时才会发生这种情况。此问题也不适用于numberOfRowsInSection
或viewForHeaderInSection
。
任何人都可以帮助我理解为什么会这样吗?
答案 0 :(得分:0)
虽然我不确定是什么触发@objc
,但我可以建议以下方法:
将tableView变量存储在viewDidLoad中的某个位置:
let tv = tableView!
然后将鼠标悬停在tableView变量上并同时按下命令按钮。
这会带您进入UITableView的界面。
然后,将鼠标悬停在UITableViewDelegate或UITableViewDataSource上,并同时按下命令按钮。
现在您可以看到新的签名。
很多变化......快乐升级!
答案 1 :(得分:0)
如果从Objective c使用此函数,Swift编译器必须在函数之前强制写入Objc(funcName)。根据app doc
使用@objc(name)属性为其提供Objective-C名称 必要时的属性和方法。例如,您可以标记一个 调用的属性已启用,其中包含一个名为isEnabled的getter Objective-C是这样的:
var enabled: Bool {
@objc(isEnabled) get {
// ...
}
}
extension YourViewControllerName:UITableViewDataSource, UITableViewDelegate { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCell() as SplitAddContactCell return cell } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 80.0 } }