条件付きバインディング:エラーが発生した場合–条件付きバインディングの初期化子にはオプションタイプが必要です


120

データソースと次のコード行から行を削除しようとしています。

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 {

8
以来、tableViewオプションの値ではなく、それがnilであるかどうかをチェックする必要はありません。あなたは直接削除することを私は平均、それを使用することができますのでif let 、ちょうど使用tableView機能で
エリック銭

後世のために私はこの問題を修正した後、私はに走ったvariable with getter/setter cannot have an initial value、単にこの答えたala、初期化後に残っ{}ブロックを除去することによって解決された:stackoverflow.com/a/36002958/4544328
ジェイクT.

回答:


216

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です。



16

カスタムセルタイプ(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?
lilbiscuit

9

同じことがガードステートメントにも当てはまります。同じエラーメッセージがこの投稿と回答につながります(@nhgrifに感謝します)。

コード:ミドルネームが4文字未満の場合にのみ、人物の姓を出力します。

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)!")
}

最後にオプションパラメータとして宣言するまで、同じエラーが発生していました。


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


        }
    }
}

これは問題なく動作しますが、使用する場合はオプティナルタイプ "?"が必要です。


0

まあ、ifの条件の中で通常の値を宣言できれば、(構文的に)便利です。だから、ここにトリックがあります:あなたはコンパイラにOptional.some(T)そのように値への割り当てがあると思わせることができます:

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.