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

时间:2015-06-24 23:21:04

标签: ios swift optional-binding

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

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 个答案:

答案 0 :(得分:191)

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更改为CGSizeMake(0.01, 0.01)

答案 1 :(得分:15)

我的具体问题我必须更换

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

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

答案 2 :(得分:13)

如果您使用自定义单元格类型,例如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类型的单元格使用可选的强制转换。

答案 3 :(得分:8)

同样适用于后卫语句。同样的错误信息引导我发帖并回答(感谢@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 :(得分:4)

条件绑定必须具有optinal类型,这意味着您只能在if语句

中绑定可选值
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? {


        }
    }
}

这样可以正常工作,但确保在使用时如果让它必须具有光学类型&#34;?&#34;

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

  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
        }