web-dev-qa-db-ja.com

「宣言はファイルスコープでのみ有効」について

Class + extension Swiftファイルがあります。別のファイルで宣言したデリゲートをクラスに追加すると、Xcodeは拡張子行に「宣言はファイルスコープでのみ有効です」と表示します。問題が何かわからない。

誰でもそれを修正するのを手伝ってくれますか?

class ListViewController: UIViewController, AddItemViewControllerDelegate {...}

extension ListViewController: UITableViewDataSource{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        performSegueWithIdentifier("ShowDetail", sender: indexPath)
    }

}
48
Dennis

エラーは...のどこかにあります。このエラーはListViewControllerクラスが閉じられなかったことを意味するため、拡張機能は次のようにネストされていると解釈されます。

class ListViewController {
    ...
    extension ListViewController {
    }
}

不足している閉じ括弧を見つけて、問題を解決する必要があります。

95
Nate Cook

拡張機能はルートレベルにある必要があります。クラスなどに埋め込むことはできません。

15
Jordan

拡張機能がメインクラスの最後と最後の中括弧 "}"の後に宣言されていることを確認してください

class ListViewController: UIViewController, AddItemViewControllerDelegate {
   //Make sure that everything is clean here! 
}

extension ListViewController: UITableViewDataSource{
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        performSegueWithIdentifier("ShowDetail", sender: indexPath)
    }
}
15
polarwar

クラスと拡張機能が分離されていることを確認してください。

class ViewController: UIViewController {}

extension name: type {}
4

ファイルの下部に拡張機能の呼び出しがあり、それらを上部に配置して、それを修正しました。一番下では、それらはクラススコープの外にあったので、少し困惑し、これを試してみました。

0
John Markham