Ich habe einige Beiträge durchsucht, ich glaube, ich kann unter swift keine Erweiterung schreiben und sie aus Objective-C-Code aufrufen, oder?
@objc wie Attribute unterstützen nur Methoden, Klassen, Protokolle?
Ich habe einige Beiträge durchsucht, ich glaube, ich kann unter swift keine Erweiterung schreiben und sie aus Objective-C-Code aufrufen, oder?
@objc wie Attribute unterstützen nur Methoden, Klassen, Protokolle?
Antworten:
Sie können eine Swift-Erweiterung schreiben und in Objective-C-Code verwenden. Getestet mit XCode 6.1.1.
Alles was Sie tun müssen ist:
Erstellen Sie Ihre Erweiterung in Swift (keine @objc
Anmerkung)
#import "ProjectTarget-Swift.h"
in Ihrer Objective-C-Klasse (wobei "ProjectTarget" das XCode-Ziel darstellt, dem die Swift-Erweiterung zugeordnet ist)
Rufen Sie die Methoden aus der Swift-Erweiterung auf
Update:
Ab @Rizwan Ahmed müssen Sie eine @objc
Anmerkung hinzufügen :
Ab Swift 4.0.3 wird die Annotation @objc benötigt, wenn Sie die Erweiterung in Objective C-Klassendateien verwenden möchten.
Ich fand heraus, dass ich in Swift 4.0@objc
vor meinem Erweiterungsschlüsselwort hinzufügen musste, damit die Swift-Erweiterungsmethoden für eine Instanz der von mir erweiterten Objc-Klasse sichtbar wurden.
Zusamenfassend:
Setup der Dateikonfiguration:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
In CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
In meinem AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
Anmerkung hinzufügen .
Diese Lösung funktioniert für Swift 2.2 und Swift 3 . Beachten Sie, dass von Objective-C nur auf Erweiterungen für Klassen (nicht für Strukturen oder Aufzählungen) zugegriffen werden kann.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Dann #import "ProductModuleName-Swift.h" in Ihre ObjC-Datei.
Swift 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
es nötig ist? Funktioniert gut ohne public
Modifikator für mich. Gehen wir davon aus, dass sich die Erweiterung nicht im selben Projekt befindet, sondern aus einem anderen Projekt importiert wird?
Wie in den anderen Antworten beschrieben, funktioniert das Importieren des generierten Swift-Headers in den meisten Fällen .
Eine Ausnahme bildet, wenn die Kategorie für einen überbrückten Typ definiert ist (dh die Erweiterung ist für definiert String
und nicht NSString
). Diese Kategorien werden nicht automatisch mit ihren Objective-C-Gegenstücken verknüpft. Um dies zu umgehen, müssen Sie entweder den Objective-C-Typ verwenden (und den Rückgabewert in Ihren Swift-Code umwandeln as String
) oder eine Erweiterung für den Swift- und den Objective-C-Typ definieren.
public extension NSString
. Sollten Sie beim Kompilieren einen ungelösten Bezeichner oder einen ähnlichen Fehler erhalten, können Sie erneut auf String zurückgreifen, z. B. let sVal = self as String
den erforderlichen Code sVal
mclaughlinj
gesagt, sowohl für die NSString-Klasse als auch für die String-Struktur