139

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

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 {
4

8 回答 8

236

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

于 2015-06-25T00:43:08.873 回答
20

对于我的具体问题,我必须更换

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

let count = 1
if(count > 0)
    {
        // do something ...
    }
于 2015-11-08T22:07:19.253 回答
19

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

于 2017-11-01T09:08:16.190 回答
10

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

于 2016-09-11T15:44:36.073 回答
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? {


        }
    }
}

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

于 2017-03-20T08:01:18.037 回答
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
        }
于 2021-07-31T12:28:13.260 回答
0

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

于 2020-11-03T23:43:15.427 回答
0

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

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
于 2020-07-22T13:53:34.810 回答