2016-02-01 7 views
23

voglio che questo protocollo:Come richiedere che un protocollo può essere adottato solo da una classe specifica

protocol AddsMoreCommands { 
    /* ... */ 
} 

solo da adottare dalle classi che ereditano dalla classe UIViewController. This page mi dice che posso specificare che esso è adottato solo da una classe (al contrario di una struct) scrivendo

protocol AddsMoreCommands: class { 
} 

ma non riesco a vedere come richiedere che è adottata solo da una particolare classe. That page later parla dell'aggiunta delle clausole where alle estensioni del protocollo per verificare la conformità, ma non riesco a vedere come adattarle.

extension AddsMoreCommands where /* what */ { 
} 

C'è un modo per farlo? Grazie!

risposta

44
protocol AddsMoreCommands: class { 
    // Code 
} 

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

ho per poco non l'avevo ... Ho scritto 'self' invece di' Sé :-(Grazie mille, va benissimo! – emrys57

+0

yep :) Penso che questo sia il punto di Self – Roee84

+0

Per me, questo causa qualche stranezza sintattica quando uso questo in congiunzione con il casting. –

11

Questo può essere ottenuto anche senza estensione:

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

a cura: Come Zig sottolineato, questo sembra generare un avviso su Xcode 9.1. Attualmente c'è un problema segnalato sul progetto Swift (SR-6265) per rimuovere l'avviso, lo terrò d'occhio e aggiornerò la risposta di conseguenza.

+0

In che coincidenza ho fatto clic su una domanda di due anni e ho trovato una soluzione perfetta pubblicata un'ora fa –

+0

Xcode 9.1 ora mi sta dando un avvertimento su questo detto: Vincolo di layout ridondante 'Self': 'AnyObject'. Vincolo del vincolo di layout 'Self': 'AnyObject' implicito qui. Cambiare il mio codice nel formato della risposta accettata sembra essere più buono. – Zig

+0

A partire da Xcode 9.1 i protocolli di solo classe ora usano 'AnyObject' invece di' class'. 'protocol AddsMoreCommands: AnyObject dove Self: UIViewController {// code}' – dodgio

4

causa di un problema nella risposta precedente ho finito con questa dichiarazione:

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

nessun avviso in Xcode 9.1

Problemi correlati