Ich versuche, ein Swift-Protokoll mit dem Namen AnalyticProtocol
in eine Objective-C-Klasse mit dem Namen zu importieren AnalyticFactory
.
protocol AnalyticProtocol
{
}
Ich gehe von einem vorhandenen Objective-C-Projekt aus (ich habe mit xCode kein neues Swift-Projekt erstellt und nicht herausgefunden, wie ich mein Objective-C-Projekt in xCode 6 als Swift-Projekt konfigurieren kann ).
In meine Swift-Datei habe ich die .h
Datei mit dem Namen aufgenommen, MyProjectName-Swift.h
aber der Compiler hat mir einen Fehler zurückgegeben, der mir mitteilt, dass sie nicht vorhanden ist . Also habe ich eine .h
Datei mit dem Namen erstellt, MyProjectName-Swift.h
die tatsächlich leer ist (ich weiß nicht, was ich einfügen soll).
In der Apple-Dokumentation heißt es, dass ich meine .h
benannte Datei MyProjectName-Swift.h
in meine .m
Datei aufnehmen muss. Aber ich muss es nicht in meine .m
Datei aufnehmen, sondern in meine .h
. Kann das problematisch sein?
Beim Kompilieren wird der folgende Fehler angezeigt :: 0: Fehler: xxxAnalyticFactory.h: 39: Protokolldeklaration für 'AnalyticProtocol' kann nicht gefunden werden
Und der belastete Code:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Ich glaube, ich verstehe nicht gut, wie ich ein Swift-Protokoll in eine Objective-C-Klasse importieren kann.
Hat jemand einen Fehler in dem gesehen, was ich tue?
quelle
Antworten:
Sie müssen das
@objc
Attribut wie folgt zu Ihrem Swift-Protokoll hinzufügen :quelle
@interface
in der.h
Datei hinzugefügt wird . Sie können das Protokoll jedoch zu dem privaten@interface
in der.m
Datei hinzufügen und es behebt Probleme (zumindest gelegentlich für mich). Also über Ihre@implementation
haben@interface MyController() <AnalyticProtocol>
.Es ist nicht möglich, den von Xcode generierten Swift-Header in objC-Header-Dateien zu importieren.
Da Sie also Swift-Code in einer objC-Header-Datei verwenden möchten, müssen Sie die Klassen und Protokolle, die Sie in der objC-Header-Datei verwenden möchten, wie folgt "weiter deklarieren":
Sie können das Protokoll jetzt in Ihrer objC-Klassendeklaration verwenden:
In Ihrer Implementierungsdatei (die objC .m-Datei) können Sie die von Xcode generierte Swift-Headerdatei ("ProductModuleName-Swift.h") importieren, und die richtige Implementierung
AnalyticProtocol
ist dem Compiler jetzt bekannt.Dies wird auch im Abschnitt "Verwenden von Swift von Objective-C" in den Apple Docs beschrieben
Beachten Sie, dass XCode eine Warnung in der objC-Header-Datei ausgibt, wenn Sie das vorwärts deklarierte Protokoll verwenden ("Protokolldefinition für 'AnalyticProtocol' kann nicht gefunden werden), dies kann jedoch ignoriert werden - die Implementierung wird zur Kompilierungszeit gefunden.
quelle
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Für alle, die lediglich ein Protokoll benötigen - Sie können dies in zwei Schritten tun, ohne Warnungen oder Fehler zu generieren:
Fügen Sie in Ihrer
.swift
Datei@objc
vor dem Protokollnamen Folgendes hinzu:.m
Importieren Sie in Ihrer Datei den generierten Swift-Header und übernehmen Sie das Protokoll in eine private Kategorie. (Die Header-Datei wird automatisch benannt):Dies ist der von Apple empfohlene Ansatz. Weitere Informationen zum Mischen und Anpassen von Objective-C und Swift finden Sie hier: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
quelle
#import "AnalyticProtocol-Swift.h"
. Sieht so aus, als würde WhateverProtocol-Swift.h nicht automatisch generiert, wie Sie sagten.Wenn Sie ein Framework erstellen, wird der erforderliche Import durchgeführt
Änderungen an:
In diesem Fall müssen Sie auch die rasche Protokoll machen Öffentlichkeit :
quelle
Wir können schnelle Protokolle in Ziel C mit wenigen Änderungen am Code verwenden. Mit den von @objc deklarierten Protokollen können Sie außerdem optionale und erforderliche Methoden ohne Standardimplementierungen verwenden. Es kommt mit Vor- und Nachteilen.
Wir könnten den Protokollnamen bei Verwendung in Ziel C tatsächlich in einen aussagekräftigeren Namen umbenennen. Ich verwende "@objc (alias_name)".
Hier ist der Code: Lassen Sie uns ein schnelles Protokoll mit dem Attribut @objc und dem Aliasnamen verwenden, das im ObjC-Code verwendet werden soll.
Lassen Sie uns nun farword unser Protokoll in der .h-Datei deklarieren
Sie können dieses Protokoll jetzt in der M-Datei anpassen und die Implementierung der erforderlichen Methoden hinzufügen.
quelle