2015-09-04 9 views
13

Lassen Sie uns sagen, dass ich eine generische Klasse in Swift, ähnlich der folgenden definieren:eine allgemeine Swift Klasse in Objective-C Mit

class MyArray<T> { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

(ich weiß, dass es ein leicht ist eine bessere Umsetzung der Anordnung, das ist lediglich ein Beispiel)

In Swift ich jetzt diese Klasse sehr leicht bedienen kann.

let a = MyArray<String>() 
a.addObject("abc") 

With Xcode 7, we now have generics in Objective-C, also würde ich davon ausgehen, dass ich zusammen uld diese Klasse in Objective-C verwenden:

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init]; 
[a addObject:@"abc"]; 

ist jedoch MyArray nie zu meiner Project-Swift.h Datei hinzugefügt. Selbst wenn ich es so ändere, dass es von NSObject erbt, erscheint es immer noch nicht in meiner Swift.h-Datei.

Gibt es eine Möglichkeit, eine generische Swift-Klasse zu erstellen und sie dann in Objective-C zu verwenden?


Update: Wenn ich versuche, von NSObject zu erben und mit Anmerkungen versehen mit @objc:

@objc(MyArray) 
class MyArray<T>: NSObject { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

ich die folgenden Compiler-Fehler:

Generic subclasses of '@objc' classes cannot have an explicit '@objc' attribute because they are not directly visible from Objective-C.

Bedeutet dies, es gibt keine Möglichkeit, eine generische Swift-Klasse in Objective-C zu verwenden?

Wie kann man in direkt Bezug auf die Klasse?

+0

Haben Sie Ihre Klasse mit einem @objc versehen? –

+0

@MrBeardsley Ich habe es gerade versucht und es gab einen interessanten Compiler Fehler (siehe oben). – Senseful

Antwort

17

Schnelle generische Typen können in Objective-C nicht verwendet werden.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID136

This excludes Swift-only features such as those listed here:

  • Generics
  • ...
+0

Wurde das Dokument für Xcode 7 aktualisiert? Da es in Objective-C nun Generika gibt, wäre das nicht nur ein Swift-Only-Feature? – Senseful

+1

@Sensful: Lightweight Generics in Objective-C unterscheiden sich von und viel mehr als Swift Generics. – newacct

+0

@newacct Kennen Sie eine Webseite, die die Einschränkungen beschreibt? – finneycanhelp

0

Es gibt eine Abhilfe für einige Situationen, wenn Sie Swift generische Klasse in Objective-C importieren müssen.

Nehmen wir an, Sie haben Swift REST Service, der Generics verwendet. Ich verwende Moya Rahmen und das ist, wie mein Dienst wie folgt aussieht:

class AuthService: BaseService<AuthAPI> { 
    func register(email: String) { 
     // ... 
    } 
} 

Es ist von der Basis-Service geerbt der Verwendung von Generika, also kann ich es nicht direkt in meinem Objective-C-Code verwenden.

ist also hier eine Abhilfe:

AuthServiceProtocol Lets erstellen:

@objc protocol AuthServiceProtocol { 
    func register(email: String) 
} 

Dann lassen Sie uns einen Stoff für den Dienst erstellen (oder eine Singleton-Methode, kein Unterschied):

@objc class Services: NSObject { 
    static let authService: AuthServiceProtocol = AuthService() 
} 

Dann Ich bin in der Lage, meinen generischen Swift-Auth-Service aus dem Objective-C-Code aufzurufen:

- (void)someObjcMethod { 
    [Services.authService registerWithEmail:self.email]; 
} 
+0

Ich die Dienste in meiner Obj-C-Klasse erfolgreich aufrufen, aber es gibt Fehler, wenn ich versuchte, AuthService zu verwenden. "Eigenschaft 'authService' wurde nicht im Objekt vom Typ 'Dienste' gefunden. Bitte helfen Sie mir, dieses Problem zu lösen –

Verwandte Themen