Swift 3 UITableViewDataSource选择器

时间:2016-09-20 09:46:49

标签: ios swift

更新到Swift 3后,我在以下代码中收到错误:

extension MyViewController: UITableViewDataSource {
    //...

    func tableView(_ tableView: UITableView, 
                   heightForRowAt indexPath: IndexPath) -> CGFloat {
        return someValue
    }
}
  

Objective-C方法'tableView:heightForRowAt:'由方法提供   'tableView(_:heightForRowAt :)'与要求不匹配   selector('tableView:heightForRowAtIndexPath:')

可以用

修复
@objc(tableView:heightForRowAtIndexPath:)
func tableView(_ tableView: UITableView,
               heightForRowAt indexPath: IndexPath) -> CGFloat {
    return someValue
}

有没有人可以解释新版Swift中签名变更的动机? migration guide中没有关于它的信息。

1 个答案:

答案 0 :(得分:2)

随着 Swift 3.0 的发布,为了便于阅读,库中许多方法的签名已经改变(参见API Design Guidelines)。

比较您在 Xcode 的代码完成建议列表中引用它的方法的当前签名:

// implementation:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {...}

// code completion:
tableView(tableView: UITableView, heightForRowAt: IndexPath)

相比之前的实施用于显示冗余信息:

// implementation:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {...}

// code completion:
tableView(tableView: UITableView, heightForRowAtIndexPath: NSIndexPath)
                                                ---------  -----------

此外,函数或方法的实现现在需要为第一个参数设置下划线(_),以便在调用函数/方法时允许省略参数标签(请参阅:{{3} })。

显然,图书馆中的某些选择器尚未更新,因此您需要提供正确的(#34;旧的#34;)选择器名称(请参阅:https://stackoverflow.com/a/38192263/6793476以及有关选择器的更多信息:https://stackoverflow.com/a/39416386/6793476)。

我希望有所帮助。