Я пытаюсь импортировать протокол Swift с именем AnalyticProtocol
в класс Objective-C с именем AnalyticFactory
.
protocol AnalyticProtocol
{
}
Я начинаю с существующего проекта Objective-C (я не создавал новый проект Swift с xCode, и я не нашел, как настроить мой проект Objective-C как проект Swift в xCode 6 ).
В свой файл Swift я включил .h
файл с именем, MyProjectName-Swift.h
но компилятор вернул мне ошибку, сообщающую мне, что его не существует . Итак, я создал .h
файл с именем, MyProjectName-Swift.h
который на самом деле пуст (я не знаю, что мне поместить внутрь).
В документации Apple сказано, что я должен включить свой .h
файл с именем MyProjectName-Swift.h
в свой .m
файл. Но мне нужно включить его не в свой .m
файл, а в свой .h
. Это может быть проблематично?
Когда я пытаюсь скомпилировать, я получаю эту ошибку:: 0: error: xxxAnalyticFactory.h: 39: не удается найти объявление протокола для 'AnalyticProtocol'
И инкриминируемый код:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Думаю, я плохо понимаю, как мне импортировать протокол Swift в класс Objective-C.
Кто-нибудь видит ошибку в том, что делаю?
источник
Ответы:
Вам нужно добавить
@objc
атрибут в свой протокол Swift следующим образом:источник
@interface
в.h
файл. Однако, вы можете добавить протокол к частному@interface
в.m
файл и фиксируют вещи (по крайней мере , у него есть для меня по случаю). Так что прежде всего у вас@implementation
есть@interface MyController() <AnalyticProtocol>
.Невозможно импортировать созданный Xcode заголовок Swift в файлы заголовков objC.
Итак, поскольку вы хотите использовать код Swift в файле заголовка objC, вам нужно будет «пересылать объявление» классов и протоколов, которые вы хотите использовать в файле заголовка objC, например:
Теперь вы можете использовать протокол в объявлении класса objC:
В вашем файле реализации (файл objC .m) вы можете импортировать созданный Xcode файл заголовка Swift ("ProductModuleName-Swift.h"), и
AnalyticProtocol
теперь компилятору будет известна правильная реализация .Это также описано в разделе «Использование Swift из Objective-C» в документации Apple.
Обратите внимание, что XCode выдаст предупреждение в файле заголовка objC, когда вы используете заявленный вперед протокол («Не удается найти определение протокола для 'AnalyticProtocol'), но это можно игнорировать - реализация будет найдена во время компиляции.
источник
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Для тех, кому просто нужно принять протокол - вы можете сделать это в два этапа, без каких-либо предупреждений или ошибок:
В вашем
.swift
файле@objc
перед названием протокола добавьте :В своем
.m
файле импортируйте сгенерированный заголовок Swift и перенесите протокол в частную категорию. (Заголовочный файл получает имя автоматически):Это рекомендуемый подход Apple. Вы можете узнать больше о смешивании и сопоставлении Objective-C и Swift здесь: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
источник
#import "AnalyticProtocol-Swift.h"
. Похоже, что WhateverProtocol-Swift.h не создается автоматически, как вы сказали.Если вы создаете фреймворк, необходимый импорт
изменения к:
В этом случае вы также должны сделать быстрый протокол общедоступным :
источник
Мы можем использовать быстрые протоколы в Objective C с небольшими изменениями кода. Кроме того, протоколы, объявленные @objc, позволяют использовать дополнительные и обязательные методы без реализаций по умолчанию. У него есть свои плюсы и минусы.
Мы могли бы фактически переименовать имя протокола в более наглядное при использовании в Objective C. Я использую «@objc (alias_name)».
Вот код: давайте получим быстрый протокол с атрибутом @objc и псевдонимом для использования в коде ObjC.
Теперь давайте объявим наш протокол в файле .h.
Теперь вы можете согласовать этот протокол в файле .m и добавить реализацию необходимых методов.
источник