2016-02-01 12 views
23

chcę tego protokołu:Jak wymagać, że protokół może być przyjęte tylko przez określoną klasę

protocol AddsMoreCommands { 
    /* ... */ 
} 

tylko być przyjęty przez klas, które dziedziczą z klasy UIViewController. This page mówi mi, mogę określić, że zostanie przyjęty tylko przez klasę (w przeciwieństwie do struct) pisząc

protocol AddsMoreCommands: class { 
} 

ale nie mogę zobaczyć, jak wymaganie, że zostanie przyjęty tylko przez określonego klasie. That page later mówi o dodawaniu klauzul o numerach where do rozszerzeń protokołów w celu sprawdzenia zgodności, ale nie mogę też zrozumieć, jak to zaadaptować.

extension AddsMoreCommands where /* what */ { 
} 

Czy jest sposób na zrobienie tego? Dzięki!

Odpowiedz

44
protocol AddsMoreCommands: class { 
    // Code 
} 

extension AddsMoreCommands where Self: UIViewController { 
    // Code 
} 
+1

I tak prawie pędził ... Napisałem 'self' zamiast' Self' :-(Dziękuję bardzo, to działa dobrze! – emrys57

+0

yep :) Myślę, że to jest punkt Self – Roee84

+0

Dla mnie to powoduje pewną dziwność składni, gdy używam tego w połączeniu z castingiem. –

11

Można to również osiągnąć bez rozszerzenia:

protocol AddsMoreCommands: class where Self: UIViewController { 
    // code 
} 

EDITED: Jak Zig zauważył, to wydaje się generować ostrzeżenia na Xcode 9.1. Obecnie zgłaszany jest problem z projektem Swift (SR-6265) w celu usunięcia ostrzeżenia, będę je sprawdzać i odpowiednio aktualizować odpowiedź.

+0

Jak przypadkowo kliknąłem na dwuletnie pytanie i znalazłem idealne rozwiązanie opublikowane godzinę temu –

+0

Xcode 9.1 ostrzega teraz przed tym stwierdzeniem: Ograniczenie redundantnego układu "Ja": "AnyObject". Ograniczenie ograniczenia układu "Własność": domniemanie "AnyObject". Zmiana mojego kodu na format akceptowanej odpowiedzi wydaje się być bardziej korzystna. – Zig

+0

Od czasu protokołów Xcode 9.1 teraz tylko "AnyObject" zamiast "class". 'protocol AddsMoreCommands: AnyObject gdzie Self: UIViewController {// code}' – dodgio

4

powodu problemu w poprzedniej odpowiedzi skończyło się z tej deklaracji:

protocol AddsMoreCommands where Self : UIViewController { 
    // protocol stuff here 
} 

żadne ostrzeżenia w Xcode 9.1

Powiązane problemy