条件绑定:如果让出错-条件绑定的初始化程序必须具有Optional类型


119

我试图从数据源和以下代码行中删除一行:

if let tv = tableView {

导致以下错误:

条件绑定的初始化程序必须具有Optional类型,而不是UITableView

这是完整的代码:

// Override to support editing the table view.
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        // Delete the row from the data source

    if let tv = tableView {

            myData.removeAtIndex(indexPath.row)

            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

我应该如何纠正以下问题?

 if let tv = tableView {

8
由于tableView不是可选值,因此无需检查它是否为nil。因此,您可以直接使用它,我的意思是删除它if let 并仅tableView在函数中使用
Eric Qian

为了后代,在解决此问题后,我遇到了variable with getter/setter cannot have an initial value,可以通过在初始化后简单地删除剩余的{}块来解决此问题,如下所示:stackoverflow.com/a/36002958/4544328
Jake T.

Answers:


216

if let/ if var可选绑定仅在表达式右侧的结果为可选时有效。如果右侧的结果不是可选的,则不能使用此可选绑定。此可选绑定的目的是检查nil变量,并且如果不是,则仅使用该变量nil

在您的情况下,tableView参数被声明为非可选类型UITableView。保证永远不会nil。因此,这里不需要进行可选的绑定。

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        myData.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

我们要做的就是摆脱if let并将其中出现的任何内容更改tv为just tableView



16

如果您使用的是自定义单元格类型(例如ArticleCell),则可能会显示错误消息:

    Initializer for conditional binding must have Optional type, not 'ArticleCell'

如果您的代码行看起来像这样,您将收到此错误:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

您可以通过以下操作解决此错误:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell?

如果检查以上内容,将会看到后者正在为ArticleCell类型的单元格使用可选强制转换。


就我而言,我需要使用as! ArticleCell?
lilbiscuit

9

这同样适用于后卫的语句。相同的错误消息将我引到该职位并回答(感谢@nhgrif)。

代码:仅当中间名少于四个字符时才打印此人的姓氏。

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) {
    guard let Name = name.last where name.middle?.characters.count < 4 else {
        print("Hi there)")
        return
    }
    print("Hey \(Name)!")
}

直到我将last作为可选参数声明之前,我都遇到了相同的错误。


4

条件绑定必须具有最佳类型,这意味着您只能在if let语句中绑定可选值

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // Delete the row from the data source

        if let tv = tableView as UITableView? {


        }
    }
}

这可以正常工作,但请确保在使用时必须让其必须具有最佳类型“?”。


0

好吧,如果我们可以在if的条件内声明通常的值,这仍然很方便(在语法上)。因此,这是一个窍门:您可以使编译器认为对的分配是Optional.some(T)这样的:

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.