Como fazer uma classe estar em conformidade com um protocolo no Swift?

121

no objetivo C:

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

em Swift:

class CustomDataSource : UITableViewDataSource {

}

No entanto, uma mensagem de erro será exibida:

  1. O tipo 'CellDatasDataSource' não está em conformidade com o protocolo 'NSObjectProtocol'
  2. O tipo 'CellDatasDataSource' não está em conformidade com o protocolo 'UITableViewDataSource'

Qual deve ser o caminho correto?

YuXuan Fu
fonte
1
O nome da classe nas mensagens de erro parece não corresponder ao código fornecido?
Matt Gibson
2
Por padrão, as classes Swift não herdam do NSObject. Eles são suas próprias classes base, a menos que especificado de outra forma.
Tim

Respostas:

251

O tipo 'CellDatasDataSource' não está em conformidade com o protocolo 'NSObjectProtocol'

Você deve herdar sua classe NSObjectpara estar em conformidade com o NSObjectProtocol. As classes Vanilla Swift não. Mas muitas partes de UIKitespera NSObjects.

class CustomDataSource : NSObject, UITableViewDataSource {

}

Mas isso:

O tipo 'CellDatasDataSource' não está em conformidade com o protocolo 'UITableViewDataSource'

É esperado. Você receberá o erro até que sua classe implemente todos os métodos necessários do protocolo.

Então comece a codificar :)

Alex Wayne
fonte
Obrigado @Alex; você salvou o meu dia, já que estou lutando há algum tempo para que minha classe Swift esteja em conformidade com o protocolo UICollectionViewDataSource. Adicionando a herança NSObject na minha classe resolveu!
iOS-Coder
1
Eu sou o único que acha que um aviso de compilação foi suficiente?
Magoo 28/10
@Magoo Certamente você quis dizer insuficiente. 'Não está em conformidade com o protocolo' não significa 'herdar do NSObject' para mim.
Roy Falk
@RoyFalk, quero dizer que um aviso de compilação foi suficiente devido a um erro ... Você pode não precisar implementar o protocolo inteiro em todos os casos e pode querer criar antes disso ... não é grande coisa, mas parece um pouco desnecessário .
Magoo 31/03
0

Uma classe deve herdar de uma classe pai antes de estar em conformidade com o protocolo. Existem principalmente duas maneiras de fazer isso.

Uma maneira é herdar NSObjecte conformar a classe com a classe UITableViewDataSource. Agora, se você deseja modificar as funções no protocolo, é necessário adicionar a palavra-chave overrideantes da chamada da função, como esta

class CustomDataSource : NSObject, UITableViewDataSource {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

No entanto, isso às vezes deixa seu código confuso, pois você pode ter muitos protocolos para conformidade e cada protocolo pode ter várias funções de delegação. Nessa situação, você pode separar o código em conformidade com o protocolo da classe principal usando extensione não precisa adicionar overridepalavras-chave na extensão. Portanto, o equivalente ao código acima será

class CustomDataSource : NSObject{
    // Configure the object...
}

extension CustomDataSource: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}
Fangming
fonte
0

O Xcode 9 ajuda a implementar todos os métodos obrigatórios do Swift Datasource & Delegates.

Aqui está um exemplo de UITableViewDataSource:

Mostra aviso / dica para implementar métodos obrigatórios:

insira a descrição da imagem aqui

Clique no botão 'Corrigir', ele adicionará todos os métodos obrigatórios no código:

insira a descrição da imagem aqui

Krunal
fonte