Swift'de bir sınıf bir protokole nasıl uydurulur?


121

Amaç-C'de:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

Swift'de:

class CustomDataSource : UITableViewDataSource {

}

Ancak bir hata mesajı görünecektir:

  1. 'CellDatasDataSource' türü 'NSObjectProtocol' protokolüne uymuyor
  2. 'CellDatasDataSource' türü 'UITableViewDataSource' protokolüne uymuyor

Doğru yol ne olmalı?


1
Hata mesajlarınızdaki sınıf adı, verdiğiniz kodla eşleşmiyor gibi görünüyor?
Matt Gibson

2
Swift sınıfları varsayılan olarak NSObject'ten devralmaz. Aksi belirtilmedikçe kendi temel sınıflarıdırlar.
Tim

Yanıtlar:


251

'CellDatasDataSource' türü 'NSObjectProtocol' protokolüne uymuyor

. Sınıfına NSObjectuymak için sınıfınızın miras almasını sağlamalısınız NSObjectProtocol. Vanilla Swift dersleri yoktur. Fakat birçok bölümü UIKitbeklediğinin NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Ama bu:

'CellDatasDataSource' türü 'UITableViewDataSource' protokolüne uymuyor

Bekleniyor. Sınıfınız protokolün tüm gerekli yöntemlerini uygulayana kadar hatayı alacaksınız.

Öyleyse kodlamaya başlayın :)


Teşekkürler @Alex; Swift sınıfımın UICollectionViewDataSource protokolüne uyması için epeyce zaman harcadığım için günümü kurtardın. NSObject mirasını Sınıfıma eklemek sorunu çözdü!
iOS-Coder

1
Derleme uyarısının yeterli olduğunu düşünen tek kişi ben miyim?
Magoo

@Magoo Elbette yetersiz demek istediniz. "Protokole uymuyor" bana "NSObject'ten devralmak" anlamına gelmez.
Roy Falk

@RoyFalk Demek istediğim, bir hata için derleme uyarısı yeterliydi ... Her durumda tüm protokolü uygulamanıza gerek kalmayabilir ve bunu yapmadan önce oluşturmak isteyebilirsiniz ... bu çok önemli değil, ama biraz gereksiz geliyor .
Magoo

0

Bir sınıf, protokole uymadan önce bir üst sınıftan miras almalıdır. Bunu yapmanın başlıca iki yolu var.

Bir yol, sınıfınızın birlikte miras alması NSObjectve ona UITableViewDataSourceuymasıdır. Şimdi protokoldeki işlevleri değiştirmek istiyorsanız override, işlev çağrısından önce bunun gibi anahtar sözcük eklemeniz gerekir.

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

Bununla birlikte, bu bazen kodunuzu karmakarışık hale getirir, çünkü uymanız gereken birçok protokol olabilir ve her protokolün birkaç temsilci işlevi olabilir. Bu durumda protokole uyan kodu kullanarak ana sınıftan ayırabilir ve uzantıya anahtar kelime extensioneklemenize gerek kalmaz override. Yani yukarıdaki kodun eşdeğeri

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 Veri Kaynağı ve Delegelerin tüm zorunlu yöntemlerinin uygulanmasına yardımcı olur.

İşte örnek UITableViewDataSource:

Zorunlu yöntemleri uygulamak için uyarı / ipucu gösterir:

görüntü açıklamasını buraya girin

'Düzelt' düğmesine tıklayın, tüm zorunlu yöntemleri koda ekleyecektir:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.