webentwicklung-frage-antwort-db.com.de

Kann Objective-C-Code Swift Erweiterung auf Klasse?

Ich habe einige Posts durchsucht. Ich glaube, ich kann unter Swift keine Erweiterung schreiben und sie vom Objective-C-Code aus aufrufen, oder?

@objc wie Attribute unterstützen nur Methoden, Klassen, Protokolle?

81
sprhawk

Sie können eine Swift Erweiterung schreiben und in ObjectiveC-Code verwenden. Getestet mit XCode 6.1.1.

Alles was Sie tun müssen ist:

  • erstelle deine Erweiterung in Swift (keine @objc Annotation)

  • importieren Sie "ProjectTarget-Swift.h" in Ihre ObjectiveC-Klasse (wobei "ProjectTarget" das XCode-Ziel darstellt, dem die Erweiterung Swift zugeordnet ist)

  • rufen Sie die Methoden von der Erweiterung Swift auf

63
marius bardan

Ich fand heraus, dass ich in Swift 4.@objc Vor meinem Endung Schlüsselwort einfügen musste, damit Swift = Erweiterungsmethoden, die von einer Instanz der Objc-Klasse, die ich erweitert habe, sichtbar gemacht werden sollen.

Zusamenfassend:

Einrichten 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];
60
Andy P.

Diese Lösung funktioniert für Swift 2.2 und Swift. Beachten Sie, dass in Objective-C nur Erweiterungen für Klassen (nicht für Strukturen oder Aufzählungen) verfügbar sind.

import UIKit

extension UIColor {

    //Custom colours
    class func otheEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

Dann # importieren Sie "ProductModuleName-Swift.h" in Ihre ObjC-Datei.

41
Foti Dim

Wie in den anderen Antworten beschrieben, funktioniert das Importieren des generierten Swift Header in den meisten Fällen.

Eine Ausnahme ist, wenn die Kategorie für einen überbrückten Typ definiert ist (d. H. Die Erweiterung ist für String und nicht NSString definiert). Diese Kategorien werden nicht automatisch mit ihren Objective-C-Gegenstücken verbunden. Um dies zu umgehen, müssen Sie entweder den Objective-C-Typ verwenden (und den Rückgabewert in den Code von Swift mit as String) oder definieren Sie eine Erweiterung für die beiden Typen Swift und Objective-C.

40
mclaughlinj

Importieren Sie "# import" ProductModuleName-Swift.h " Header in Objective-C-Datei und fügen Sie @ objc vor Ihrem Extentsion in Swift -Datei: Funktioniert problemlos in Swift 4.2 und Swift 5

0
Ranjani