クラスをSwiftのプロトコルに準拠させる方法は?


121

Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

スウィフトで:

class CustomDataSource : UITableViewDataSource {

}

ただし、エラーメッセージが表示されます。

  1. タイプ「CellDatasDataSource」はプロトコル「NSObjectProtocol」に準拠していません
  2. タイプ「CellDatasDataSource」はプロトコル「UITableViewDataSource」に準拠していません

正しい方法は何ですか?


1
エラーメッセージのクラス名が、提供されたコードと一致しないようです。
マットギブソン

2
Swiftクラスは、デフォルトではNSObjectを継承しません。特に指定のない限り、これらは独自の基本クラスです。
Tim

回答:


251

タイプ「CellDatasDataSource」はプロトコル「NSObjectProtocol」に準拠していません

NSObjectに準拠するには、クラスを継承する必要がありますNSObjectProtocol。バニラ・スウィフトのクラスにはありません。しかし、の多くの部分がUIKit期待していNSObjectます。

class CustomDataSource : NSObject, UITableViewDataSource {

}

しかしこれは:

タイプ「CellDatasDataSource」はプロトコル「UITableViewDataSource」に準拠していません

期待されています。クラスがプロトコルのすべての必要なメソッドを実装するまで、エラーが発生します。

だからコーディングを取得:)


@Alexに感謝します。私のSwiftクラスをUICollectionViewDataSourceプロトコルに準拠させるのにかなりの時間を費やしてきたので、あなたは私の一日を救いました。クラスにNSObject継承を追加すると解決しました!
iOS-Coder 2015

1
コンパイル警告で十分だと思うのは私だけですか?
Magoo

@Magoo確かにあなたは不十分を意味しました。「プロトコルに準拠していません」は、「NSObjectから継承する」という意味ではありません。
Roy Falk 2016年

@RoyFalkつまり、エラーに対してコンパイル警告で十分でした...すべてのケースでプロトコル全体を実装する必要はなく、実装する前にビルドする必要があるかもしれません...それは大したことではありませんが、少し不必要に感じます。
Magoo 2016年

0

クラスは、プロトコルに準拠する前に親クラスから継承する必要があります。それを行うには主に2つの方法があります。

1つの方法は、クラスを一緒に継承NSObjectおよび準拠させるUITableViewDataSourceことです。プロトコルの関数を変更する場合はoverride、次のように、関数呼び出しの前にキーワードを追加する必要があります

class CustomDataSource : NSObject, UITableViewDataSource {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

ただし、準拠するプロトコルが多く、各プロトコルに複数のデリゲート関数があるため、コードが煩雑になることがあります。この場合、を使用してプロトコル準拠コードをメインクラスから分離できextensionますoverride。拡張機能にキーワードを追加する必要はありません。したがって、上記のコードと同等のものは

class CustomDataSource : NSObject{
    // Configure the object...
}

extension CustomDataSource: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

0

Xcode 9は、Swift Datasource&Delegatesのすべての必須メソッドを実装するのに役立ちます。

以下に例を示しUITableViewDataSourceます。

必須メソッドを実装するための警告/ヒントを表示します:

ここに画像の説明を入力してください

「修正」ボタンをクリックすると、すべての必須メソッドがコードに追加されます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.