it-swarm.com.de

Wie kann man eine Klasse in Swift an ein Protokoll anpassen?

in Ziel-C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

in Swift:

class CustomDataSource : UITableViewDataSource {

}

Es erscheint jedoch eine Fehlermeldung:

  1. Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'NSObjectProtocol'
  2. Der Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'UITableViewDataSource'.

Was soll der richtige Weg sein?

118
YuXuan Fu

Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'NSObjectProtocol'

Sie müssen Ihre Klasse von NSObject erben lassen, um mit der NSObjectProtocol übereinzustimmen. Vanilla Swift-Klassen nicht. Aber viele Teile von UIKit erwarten NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Aber dieses:

Der Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'UITableViewDataSource'.

Es wird erwartet. Sie erhalten den Fehler, bis Ihre Klasse alle erforderlichen Methoden des Protokolls implementiert. 

Also, Codierung holen :)

243
Alex Wayne

Eine Klasse muss von einer übergeordneten Klasse erben, bevor sie mit dem Protokoll übereinstimmt. Es gibt hauptsächlich zwei Möglichkeiten, dies zu tun.

Eine Möglichkeit besteht darin, dass Ihre Klasse von NSObject erbt und gemeinsam mit der UITableViewDataSource übereinstimmt. Wenn Sie nun die Funktionen im Protokoll ändern möchten, müssen Sie vor dem Funktionsaufruf das Schlüsselwort override hinzufügen

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

Dies führt jedoch manchmal dazu, dass der Code unübersichtlich wird, da Sie möglicherweise viele Protokolle verwenden müssen, und jedes Protokoll kann mehrere Delegierungsfunktionen haben. In dieser Situation können Sie den protokollkonformen Code mithilfe von extension von der Hauptklasse trennen. In der Erweiterung müssen Sie das Schlüsselwort override nicht hinzufügen. Das Äquivalent des obigen Codes ist also

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
Fangming

Xcode 9 hilft bei der Implementierung aller obligatorischen Methoden von Swift Datasource & Delegates.

Hier ist ein Beispiel von UITableViewDataSource:

Zeigt Warnung/Hinweis zum Implementieren obligatorischer Methoden:

 enter image description here

Klicken Sie auf "Fix", um alle obligatorischen Methoden im Code hinzuzufügen:

 enter image description here

0
Krunal