2015-02-17 11 views
7

Ich habe ein Ziel c, das einen "id" -Parameter akzeptiert und ich möchte ihm ein Swift-Struct übergeben.Wie man ein Swift Struct als Parameter an eine Objective-C-Methode übergibt

// Datei: ObjcClass.m

@implementation ObjcClass 
+ (void)addListener:(id)listener { 
//... do something with listener 
} 

//file DemoStruct.swift 
Struct DemoStruct { 

    func registerAsListener() { 
    ObjcClass.addListener(self) //Cant find a way to do this 
    } 

} 

Die Kompilierung Fehlermeldung erhalte ich:

Typ 'DemoStruct' entspricht nicht Protokoll 'ANYOBJECT'

So meine Frage wäre, wie mache ich eine objektive C-Methode akzeptieren 'Any' anstelle von 'AnyObje ct 'und gibt es so etwas?

Antwort

9

Das Beste, was ich fand, war in einer Box Klasse

public class Box<T> { 
    let unbox: T 
    init(_ value: T) { 
     self.unbox = value 
    } } 
+0

Wow, das ist eine elegante Lösung. Xcode 7 beta 3. Ich musste NSObject ableiten. – neoneye

9

Sie können es nicht tun.

Swift-Strukturen sind nicht von Objective-C aus zugänglich. Dies wird in der „Verwendung von Swift mit Cocoa und Objective-C“ Buch von Apple erklärte:

Sie werden innerhalb einer Klasse oder Protokoll Zugriff auf alles haben, die so lange mit dem @objc Attribut gekennzeichnet ist, als es ist kompatibel mit Ziel c. Dies schließt Swift-nur wie jene hier aufgeführten Funktionen:

  • Generics
  • Tupeln
  • Aufzählungen definiert in Swift
  • Strukturen definiert in Swift
  • Top-Level-Funktionen in Swift definiert
  • Globale Variablen definiert in Swift
  • Typaliases definiert in Swift
  • Swift-Stil variadics
  • Verschachtelte Typen
  • Curried Funktionen

Auszug aus: Apple Inc. „Verwenden von Swift mit Cocoa und Objective-C.“ IBooks. https://itun.es/gb/1u3-0.l

+0

Dank wickeln @jrturton, Was könnte ein guter Weg sein, das zu umgehen? Vielleicht eine Dummy-Wrapper-Klasse? –

+0

Vielleicht, oder eine objc-freundliche Darstellung können Sie ohnmächtig werden. Hängt davon ab, was Sie in objective-c Land wirklich brauchen – jrturton

+0

Es gab eine Änderung über Feature-Verfügbarkeit für Enums: "Enumerations in Swift ohne Int-Rohwerttyp definiert" –

Verwandte Themen