Bagaimana cara membuat kelas sesuai dengan protokol di Swift?

121

di Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

di Swift:

class CustomDataSource : UITableViewDataSource {

}

Namun, pesan kesalahan akan muncul:

  1. Jenis 'CellDatasDataSource' tidak sesuai dengan protokol 'NSObjectProtocol'
  2. Jenis 'CellDatasDataSource' tidak sesuai dengan protokol 'UITableViewDataSource'

Bagaimana seharusnya cara yang benar?

YuXuan Fu
sumber
1
Nama kelas dalam pesan kesalahan Anda tampaknya tidak cocok dengan kode yang Anda berikan?
Matt Gibson
2
Kelas Swift secara default tidak mewarisi dari NSObject. Mereka adalah kelas dasar mereka sendiri kecuali ditentukan lain.
Tim

Jawaban:

251

Jenis 'CellDatasDataSource' tidak sesuai dengan protokol 'NSObjectProtocol'

Anda harus membuat kelas Anda mewarisi dari NSObjectagar sesuai dengan NSObjectProtocol. Kelas Vanilla Swift tidak. Tetapi banyak bagian dari UIKitharapan NSObject.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Tapi ini:

Jenis 'CellDatasDataSource' tidak sesuai dengan protokol 'UITableViewDataSource'

Diharapkan. Anda akan mendapatkan kesalahan sampai kelas Anda menerapkan semua metode protokol yang diperlukan.

Jadi dapatkan coding :)

Alex Wayne
sumber
Terima kasih @Alex; Anda menyelamatkan hari saya, karena saya telah berjuang cukup lama untuk menyesuaikan kelas Swift saya dengan protokol UICollectionViewDataSource. Menambahkan warisan NSObject di Kelas saya menyelesaikannya!
iOS-Coder
1
Apakah saya satu-satunya yang menganggap peringatan kompilasi sudah cukup?
Magoo
@Magoo Tentunya yang Anda maksud tidak cukup. 'Tidak sesuai dengan protokol' tidak berarti 'mewarisi dari NSObject' bagi saya.
Roy Falk
@RoyFalk Maksud saya peringatan kompilasi sudah cukup untuk mengatasi kesalahan ... Anda mungkin tidak perlu menerapkan seluruh protokol dalam semua kasus dan mungkin ingin membangunnya sebelum melakukannya ... ini bukan masalah besar, tetapi terasa agak tidak perlu .
Magoo
0

Sebuah kelas harus mewarisi dari kelas induk sebelum menyesuaikan dengan protokol. Terutama ada dua cara untuk melakukannya.

Salah satu caranya adalah dengan membuat kelas Anda mewarisi NSObjectdan menyesuaikan diri dengan UITableViewDataSourcekebersamaan. Sekarang jika Anda ingin mengubah fungsi dalam protokol, Anda perlu menambahkan kata kunci overridesebelum pemanggilan fungsi, seperti ini

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
    }
}

Namun ini terkadang membuat kode Anda berantakan karena Anda mungkin memiliki banyak protokol yang harus dipatuhi dan setiap protokol mungkin memiliki beberapa fungsi delegasi. Dalam situasi ini, Anda dapat memisahkan protokol yang menyesuaikan kode dari kelas utama dengan menggunakan extension, dan Anda tidak perlu menambahkan overridekata kunci dalam ekstensi. Jadi akan sama dengan kode di atas

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
    }
}
Fangming
sumber
0

Xcode 9, membantu menerapkan semua metode wajib Sumber Data & Delegasi Swift.

Berikut adalah contoh dari UITableViewDataSource :

Menunjukkan peringatan / petunjuk untuk mengimplementasikan metode wajib:

masukkan deskripsi gambar di sini

Klik tombol 'Perbaiki', itu akan menambahkan semua metode wajib dalam kode:

masukkan deskripsi gambar di sini

Krunal
sumber