【问题标题】:Conditional Binding: if let error – Initializer for conditional binding must have Optional type条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型
【发布时间】:2015-09-11 09:01:19
【问题描述】:

我正在尝试从我的数据源和以下代码行中删除一行:

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 {

【问题讨论】:

  • 由于tableView不是可选值,所以不需要检查它是否为nil。所以你可以直接使用它,我的意思是删除那个if let并在函数中使用tableView
  • 为了后代,在我解决了这个问题之后,我遇到了variable with getter/setter cannot have an initial value,通过在初始化后简单地删除剩余的 { } 块来解决这个问题,这个答案:stackoverflow.com/a/36002958/4544328

标签: ios swift optional-binding


【解决方案1】:

如果您检查文本字段,请确保可选文本?

  guard let msg = message.text?.trimmed,!messaged.isEmpty,messaged.count >= 14 else {
            MyVariables.status.image = UIImage(named: "wrong")
            MyVariables.status.message = "Enter Your Message".localized
            MyVariables.status.showInKeyWindow()
            return
        }

【讨论】:

    【解决方案2】:

    它告诉你的是 - 2nd guard letif let check 没有发生在 Optional Int 或 Optional String 上。您已经有一个非可选值,因此不再需要保护或 if-letting

    【讨论】:

      【解决方案3】:

      好吧,如果我们可以在 if 的条件中声明通常的值,它仍然很方便(在语法上)。所以,这里有一个技巧:你可以让编译器认为有一个 Optional.some(T) 赋值给一个像这样的值:

          if let i = "abc".firstIndex(of: "a"),
              let i_int = .some(i.utf16Offset(in: "abc")),
              i_int < 1 {
              // Code
          }
      

      【讨论】:

        【解决方案4】:

        同样适用于 guard 语句。相同的错误消息将我引导至此帖子并回答(感谢@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 声明为可选参数之前,我看到了同样的错误。

        【讨论】:

          【解决方案5】:

          如果您使用的是自定义单元格类型,比如 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?
          【解决方案6】:

          条件绑定必须具有可选类型,这意味着您只能在 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? {
          
          
                  }
              }
          }
          

          这可以正常工作,但请确保当您使用 if let 它必须具有可选类型“?”

          【讨论】:

            【解决方案7】:

            对于我的具体问题,我不得不更换

            if let count = 1
                {
                    // do something ...
                }
            

            let count = 1
            if(count > 0)
                {
                    // do something ...
                }
            

            【讨论】:

            【解决方案8】:

            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 更改为tableView

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-06-28
              • 2019-03-11
              • 2017-01-22
              • 2018-03-25
              • 2016-01-08
              相关资源
              最近更新 更多