Come rendere una classe conforme a un protocollo in Swift?


121

in Objective-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

in Swift:

class CustomDataSource : UITableViewDataSource {

}

Tuttavia, verrà visualizzato un messaggio di errore:

  1. Il tipo "CellDatasDataSource" non è conforme al protocollo "NSObjectProtocol"
  2. Il tipo "CellDatasDataSource" non è conforme al protocollo "UITableViewDataSource"

Quale dovrebbe essere il modo corretto?


1
Il nome della classe nei tuoi messaggi di errore non sembra corrispondere al codice fornito?
Matt Gibson

2
Le classi Swift non ereditano per impostazione predefinita da NSObject. Sono le loro classi base se non diversamente specificato.
Tim

Risposte:


251

Il tipo "CellDatasDataSource" non è conforme al protocollo "NSObjectProtocol"

Devi fare in modo che la tua classe erediti da NSObjectper conformarsi a NSObjectProtocol. Le classi Vanilla Swift no. Ma molte parti di UIKitaspettarsi NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Ma questo:

Il tipo "CellDatasDataSource" non è conforme al protocollo "UITableViewDataSource"

È prevista. Otterrai l'errore finché la tua classe non implementerà tutti i metodi richiesti del protocollo.

Quindi inizia a programmare :)


Grazie @Alex; mi hai salvato la giornata, dato che ho lottato un po 'di tempo per rendere la mia classe Swift conforme al protocollo UICollectionViewDataSource. L'aggiunta dell'eredità NSObject nella mia classe lo ha risolto!
iOS-Coder

1
Sono l'unico che pensa che un avviso di compilazione sia sufficiente?
Magoo

@Magoo Sicuramente volevi dire insufficiente. "Non è conforme al protocollo" non significa "eredita da NSObject" per me.
Roy Falk

@RoyFalk Voglio dire che un avviso di compilazione è stato sufficiente per un errore ... Potrebbe non essere necessario implementare l'intero protocollo in tutti i casi e potresti voler compilare prima di farlo ... non è un grosso problema, ma sembra un po 'inutile .
Magoo

0

Una classe deve ereditare da una classe genitore prima di conformarsi al protocollo. Ci sono principalmente due modi per farlo.

Un modo è fare in modo che la tua classe erediti NSObjecte si conformi a UITableViewDataSourcetogether. Ora se vuoi modificare le funzioni nel protocollo, devi aggiungere la parola chiave overrideprima della chiamata della funzione, in questo modo

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

Tuttavia, questo a volte crea confusione nel codice perché potresti avere molti protocolli a cui conformarti e ogni protocollo può avere diverse funzioni delegate. In questa situazione, è possibile separare il codice conforme al protocollo dalla classe principale utilizzando extensione non è necessario aggiungere la overrideparola chiave nell'estensione. Quindi l'equivalente del codice sopra sarà

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, aiuta a implementare tutti i metodi obbligatori di Swift Datasource & Delegates.

Ecco un esempio di UITableViewDataSource:

Mostra avvertenze / suggerimenti per implementare metodi obbligatori:

inserisci qui la descrizione dell'immagine

Fare clic sul pulsante "Correggi", aggiungerà tutti i metodi obbligatori nel codice:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.