我正在尝试从我的数据源和以下代码行中删除一行:
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 {
答案 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 let
或if 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
}