条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型
Posted
技术标签:
【中文标题】条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型【英文标题】:Conditional Binding: if let error – Initializer for conditional binding must have Optional type 【发布时间】:2015-06-24 23:21:04 【问题描述】:我正在尝试从我的数据源和以下代码行中删除一行:
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
,通过在初始化后简单地删除剩余的 块来解决这个问题,这个答案:***.com/a/36002958/4544328
【参考方案1】:
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
。
【讨论】:
【参考方案2】:对于我的具体问题,我不得不更换
if let count = 1
// do something ...
与
let count = 1
if(count > 0)
// do something ...
【讨论】:
这个人的最佳答案见 cmets ***.com/a/31039427/2797944【参考方案3】:如果您使用的是自定义单元格类型,比如 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?
【参考方案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】:条件绑定必须具有可选类型,这意味着您只能在 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 它必须具有可选类型“?”
【讨论】:
【参考方案6】:好吧,如果我们可以在 if 的条件中声明通常的值,它仍然很方便(在语法上)。所以,这里有个技巧:你可以让编译器认为有一个 Optional.some(T)
赋值给一个像这样的值:
if let i = "abc".firstIndex(of: "a"),
let i_int = .some(i.utf16Offset(in: "abc")),
i_int < 1
// Code
【讨论】:
【参考方案7】:它告诉你的是 - 2nd guard let
或 if let check
没有发生在 Optional Int 或 Optional String 上。您已经有一个非可选值,因此不再需要保护或 if-letting
【讨论】:
【参考方案8】:如果您检查文本字段,请确保可选文本?
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
【讨论】:
以上是关于条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型的主要内容,如果未能解决你的问题,请参考以下文章
条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型
SWIG C++/Python 绑定和支持带有 std::enable_if 的条件成员
SwiftUI 绑定布尔 if 语句(无法将类型 'Binding<Bool>' 的值转换为预期的条件类型 'Bool')