Ich möchte dieses Protokoll:
protocol AddsMoreCommands {
/* ... */
}
Nur von Klassen zu übernehmen, die von der Klasse erben UIViewController
. Auf dieser Seite kann ich angeben, dass sie nur von einer Klasse (im Gegensatz zu einer Struktur) schriftlich übernommen wird
protocol AddsMoreCommands: class {
}
aber ich kann nicht sehen, wie ich verlangen soll, dass es nur von einer bestimmten Klasse übernommen wird. Auf dieser Seite wird später über das Hinzufügen von where
Klauseln zu Protokollerweiterungen gesprochen, um die Konformität zu überprüfen, aber ich kann auch nicht sehen, wie dies angepasst werden kann.
extension AddsMoreCommands where /* what */ {
}
Gibt es eine Möglichkeit, dies zu tun? Vielen Dank!
self
stattSelf
:-( Vielen Dank, das funktioniert gut!AddsMoreCommands
aber eine Methode, an die Sie sie übergeben, einenUIViewController
Dies kann auch ohne Erweiterung erreicht werden:
EDITED 2017/11/04 : Wie Zig betonte, scheint dies eine Warnung auf Xcode 9.1 zu generieren. Derzeit wurde ein Problem mit dem Swift-Projekt gemeldet (SR-6265). , um die Warnung zu entfernen. Ich werde sie im Auge behalten und die Antwort entsprechend aktualisieren.
EDITED 2018/09/29 :
class
Wird benötigt, wenn die Variable, in der die Instanz gespeichert wird, schwach sein muss (z. B. ein Delegat). Wenn Sie keine schwache Variable benötigen, können Sie die weglassenclass
und einfach Folgendes schreiben, und es wird keine Warnung angezeigt:quelle
AnyObject
anstelle von verwendetclass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
Aufgrund eines Problems in der vorherigen Antwort kam ich zu folgender Erklärung:
Keine Warnungen in Xcode 9.1
quelle
AddsMoreCommands
UIViewController
typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
In Swift 5 können Sie dies erreichen, indem Sie:
Sehr praktisch.
quelle