Chcę ten protokół:
protocol AddsMoreCommands {
/* ... */
}
tylko do przyjęcia przez klasy, które dziedziczą po klasie UIViewController
. Ta strona mówi mi, że mogę określić, że jest ona przyjmowana tylko przez klasę (w przeciwieństwie do struktury), pisząc
protocol AddsMoreCommands: class {
}
ale nie rozumiem, jak wymagać, aby została przyjęta tylko przez określoną klasę. Ta strona mówi później o dodawaniu where
klauzul do rozszerzeń protokołu w celu sprawdzenia zgodności, ale nie widzę też, jak to dostosować.
extension AddsMoreCommands where /* what */ {
}
Czy jest na to sposób? Dzięki!
self
zamiast tego napisałemSelf
:-( Dziękuję bardzo, działa dobrze!AddsMoreCommands
ale metoda, którą przekazujesz, oczekujeUIViewController
Można to również osiągnąć bez przedłużenia:
protocol AddsMoreCommands: class where Self: UIViewController { // code }
ZMIENIONO 2017/11/04 : Jak zauważył Zig , wydaje się to generować ostrzeżenie w Xcode 9.1. Obecnie w projekcie Swift (SR-6265) zgłoszono problem dotyczący usunięcia ostrzeżenia, będę go obserwować i odpowiednio aktualizować odpowiedź.
EDYTOWANE 2018/09/29 :
class
jest potrzebne, jeśli zmienna, która będzie przechowywać instancję, musi być słaba (na przykład delegat). Jeśli nie potrzebujesz słabej zmiennej, możesz pominąćclass
i po prostu napisać co następuje, a nie będzie żadnego ostrzeżenia:protocol AddsMoreCommands where Self: UIViewController { // code }
źródło
AnyObject
zamiastclass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
Z powodu problemu w poprzedniej odpowiedzi skończyłem z taką deklaracją:
protocol AddsMoreCommands where Self : UIViewController { // protocol stuff here }
brak ostrzeżeń w Xcode 9.1
źródło
AddsMoreCommands
doUIViewController
którego chciałem uniknąć ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Teraz w Swift 5 możesz to osiągnąć poprzez:
protocol AddsMoreCommands: UIViewController { /* ... */ }
Całkiem przydatne.
źródło