Eu quero este protocolo:
protocol AddsMoreCommands {
/* ... */
}
apenas para ser adotado por classes que herdam da classe UIViewController
. Esta página me diz que posso especificar que ele só é adotado por uma classe (em oposição a uma estrutura) por escrito
protocol AddsMoreCommands: class {
}
mas não consigo ver como exigir que seja adotado apenas por uma classe particular. Essa página fala mais tarde sobre como adicionar where
cláusulas às extensões de protocolo para verificar a conformidade, mas também não consigo ver como adaptar isso.
extension AddsMoreCommands where /* what */ {
}
Existe uma maneira de fazer isso? Obrigado!
self
vez deSelf
:-( Muito obrigado, funciona bem!AddsMoreCommands
mas um método que você passa espera umUIViewController
Isso também pode ser alcançado sem uma extensão:
EDITADO 04/11/2017 : Como Zig apontou, isso parece gerar um aviso no Xcode 9.1. Atualmente, há um problema relatado no projeto Swift (SR-6265) para remover o aviso. Vou ficar de olho nele e atualizar a resposta de acordo.
EDITADO 29/09/2018 :
class
é necessário se a variável que irá armazenar a instância precisar ser fraca (como um delegado). Se você não precisa de uma variável fraca, pode omitir oclass
e apenas escrever o seguinte e não haverá nenhum aviso:fonte
AnyObject
vez declass
.protocol AddsMoreCommands: AnyObject where Self: UIViewController { // code }
AnyObject
Por causa de um problema na resposta anterior, acabei com esta declaração:
sem avisos no Xcode 9.1
fonte
AddsMoreCommands
para oUIViewController
qual eu queria evitar ...typealias AddsMoreCommandsViewController = UIViewController & AddsMoreCommands
Agora, no Swift 5, você pode fazer isso:
Muito prático.
fonte