Tento importar um protocolo Swift nomeado AnalyticProtocol
para uma classe Objective-C chamada AnalyticFactory
.
protocol AnalyticProtocol
{
}
Estou começando a partir de um projeto Objective-C existente (não criei um novo projeto Swift com xCode e não descobri como configurar meu projeto Objective-C para ser um projeto Swift no xCode 6 ).
No meu arquivo Swift, incluí o .h
arquivo chamado, MyProjectName-Swift.h
mas o compilador retornou um erro dizendo que ele não existe . Então, criei um .h
arquivo chamado MyProjectName-Swift.h
que está realmente vazio (não sei o que devo colocar dentro).
Na documentação da Apple eles disseram que eu tenho que incluir meu .h
arquivo nomeado MyProjectName-Swift.h
em meu .m
arquivo. Mas preciso incluí-lo não no meu .m
arquivo, mas no meu .h
. Isso pode ser problemático?
Quando tento compilar, recebo este erro:: 0: erro: xxxAnalyticFactory.h: 39: não é possível encontrar a declaração de protocolo para 'AnalyticProtocol'
E o código incriminado:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Acho que não entendo bem como posso importar um protocolo Swift para uma classe Objective-C.
Alguém vê um erro no que estou fazendo?
fonte
Respostas:
Você precisa adicionar o
@objc
atributo ao seu protocolo Swift assim:fonte
@interface
no.h
arquivo. entretanto, você pode adicionar o protocolo ao privado@interface
no.m
arquivo e ele conserta as coisas (pelo menos para mim ocasionalmente). Assim acima do@implementation
ter@interface MyController() <AnalyticProtocol>
.Não é possível importar o cabeçalho Swift gerado pelo Xcode em arquivos de cabeçalho objC.
Portanto, como deseja usar o código Swift em um arquivo de cabeçalho objC, será necessário "declarar antecipadamente" as classes e protocolos que deseja usar no arquivo de cabeçalho objC, como este:
Agora você pode usar o protocolo em sua declaração de classe objC:
Em seu arquivo de implementação (o arquivo objC .m), você pode importar o arquivo de cabeçalho Swift gerado pelo Xcode ("ProductModuleName-Swift.h") e a implementação correta
AnalyticProtocol
agora será conhecida pelo compilador.Isso também é descrito na seção "Usando Swift de Objective-C" no Apple Docs
Observe que o XCode dará um aviso no arquivo de cabeçalho objC quando você usar o protocolo declarado de encaminhamento ("Não é possível encontrar a definição de protocolo para 'AnalyticProtocol'), mas isso pode ser ignorado - a implementação será encontrada no momento da compilação.
fonte
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Para quem simplesmente precisa adotar um protocolo - você pode fazer isso em duas etapas, sem gerar nenhum aviso ou erro:
Em seu
.swift
arquivo, adicione@objc
antes do nome do protocolo:Em seu
.m
arquivo, importe o cabeçalho Swift gerado e adote o protocolo em uma categoria privada. (O arquivo de cabeçalho é nomeado automagicamente):Esta é a abordagem recomendada pela Apple. Você pode aprender mais sobre como combinar Objective-C e Swift aqui: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
fonte
#import "AnalyticProtocol-Swift.h"
. Parece que WhateverProtocol-Swift.h não é gerado automaticamente como você disse.Se você estiver criando uma estrutura, a importação necessária
muda para:
Nesse caso, você também deve tornar público o protocolo swift :
fonte
Podemos usar protocolos rápidos em Objective C com poucas alterações no código. Além disso, os protocolos declarados @objc permitem que você tenha métodos opcionais e obrigatórios sem implementações padrão. Ele vem com prós e contras.
Na verdade, poderíamos renomear o nome do protocolo para um nome mais descritivo ao usar no Objetivo C. Eu uso "@objc (alias_name)".
Aqui está o código, vamos ter um protocolo swift com atributo @objc e nome alternativo para usar no código ObjC.
Agora vamos farword declarar nosso protocolo no arquivo .h
Agora você pode estar em conformidade com este protocolo no arquivo .m e adicionar a implementação dos métodos necessários.
fonte