in Ziel-C:
@interface CustomDataSource : NSObject <UITableViewDataSource>
@end
in Swift:
class CustomDataSource : UITableViewDataSource {
}
Es wird jedoch eine Fehlermeldung angezeigt:
- Der Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'NSObjectProtocol'.
- Der Typ 'CellDatasDataSource' entspricht nicht dem Protokoll 'UITableViewDataSource'.
Was sollte der richtige Weg sein?
objective-c
swift
YuXuan Fu
quelle
quelle
Antworten:
Sie müssen Ihre Klasse erben lassen
NSObject
, um sich an die anzupassenNSObjectProtocol
. Vanilla Swift Klassen nicht. Aber viele TeileUIKit
erwartenNSObject
s.Aber dieses:
Wird erwartet. Sie erhalten den Fehler, bis Ihre Klasse alle erforderlichen Methoden des Protokolls implementiert.
Also Codierung bekommen :)
quelle
Eine Klasse muss von einer übergeordneten Klasse erben, bevor sie dem Protokoll entspricht. Es gibt hauptsächlich zwei Möglichkeiten, dies zu tun.
Eine Möglichkeit besteht darin, Ihre Klasse von
NSObject
derUITableViewDataSource
gemeinsamen erben zu lassen und sich an diese anzupassen . Wenn Sie nun die Funktionen im Protokoll ändern möchten, müssen Sieoverride
vor dem Funktionsaufruf wie folgt ein Schlüsselwort hinzufügenDies führt jedoch manchmal dazu, dass Ihr Code unübersichtlich wird, da Sie möglicherweise viele Protokolle einhalten müssen und jedes Protokoll mehrere Delegatenfunktionen haben kann. In dieser Situation können Sie den protokollkonformen Code mithilfe von von der Hauptklasse trennen
extension
, und Sie müssenoverride
der Erweiterung kein Schlüsselwort hinzufügen . Das Äquivalent des obigen Codes ist alsoquelle
Xcode 9 hilft bei der Implementierung aller obligatorischen Methoden von Swift Datasource & Delegates.
Hier ist ein Beispiel für
UITableViewDataSource
:Zeigt Warnung / Hinweis zum Implementieren obligatorischer Methoden an:
Klicken Sie auf die Schaltfläche 'Fix', um alle obligatorischen Methoden im Code hinzuzufügen:
quelle