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

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

if let tv = tableView {

导致以下错误:

条件绑定的初始化器必须具有可选类型,而不是 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 {
217318 次浏览

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

为了我的特殊问题,我不得不替换

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

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

警卫语句也是如此。同样的错误信息让我找到了这篇文章并给出了答案(多谢@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)!")
}

直到我将 最后声明为一个可选参数,我才看到同样的错误。

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




}
}
}

这将工作良好,但确保当您使用,如果让它必须有最佳类型“

在使用自定义单元格类型(比如 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 类型的单元格使用可选强制转换。

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

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

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

如果你检查文本字段,确保可选的文本?

  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
}