2016-04-06 6 views
1

Ich muss eine statische Objctive-C-Bibliothek in meinem schnellen Projekt verwenden. Alles andere geht gut, aber die NS_OPTIONS Enum definiert in der ObjC-C-Header-Datei, wie folgt aus:swift, wie ns_options in Obj-C-Klasse definiert

#import <Foundation/Foundation.h> 

typedef NS_OPTIONS(NSUInteger, MyOption) { 
    MyOptionNone = 0, 
    MyOptionTop = 1 << 0, 
    MyOptionLeft = 1 << 1, 
    MyOptionBottom = 1 << 2, 
    MyOptionRight = 1 << 3 
}; 

@interface MyObjcClass : NSObject 

@end 

und dann in der .swift Datei, wie könnte ich diese Enum in switch-case?

EDIT: ich myoption in meiner schnellen Klasse verwenden:

let option1:MyOption = .Top 
let option2:MyOption = .Bottom 
let value = option1 & option2 

dann bekomme ich Fehler kompilieren:

Binary operator '&' cannot be applied to two MyOption operands 

Wie dieses Problem zu lösen?

Antwort

5

Zuerst müssen Sie Ihre Syntax reparieren. Sie benötigen ein Semikolon nach der schließenden Klammer:

typedef NS_OPTIONS(NSUInteger, MyOption) { 
    MyOptionNone = 0, 
    MyOptionTop = 1 << 0, 
    MyOptionLeft = 1 << 1, 
    MyOptionBottom = 1 << 2, 
    MyOptionRight = 1 << 3 
}; 

Als nächstes wird in der Überbrückungs Header, müssen Sie die Header-Datei importieren, die MyOption definiert. Wenn Sie zum ersten Mal eine Swift-Quelldatei in einem Objective-C-Projekt erstellen oder wenn Sie zum ersten Mal eine Objective-C-Quelldatei in einem Swift-Projekt erstellen, bietet Xcode an, den Bridging-Header für Sie zu erstellen. Es heißt ProjectName-Bridging-Header.h. So zum Beispiel:

bridging header

Sobald Sie dies getan haben, und beide Header-Dateien können ohne Fehler kompiliert werden, Sie MyOption von Swift verwenden können. Es ist ein OptionSetType. Beispiel:

MyOption usage

+0

Hallo, rob, das weiß ich, aber was, wenn ich myoption in switch-case verwenden? "case.Top" verursacht Kompilierungsfehler: Enum case "Top" nicht im Typ MyOption gefunden – SomnusLee

+1

Die Verwendung in einem switch-case ist nicht sinnvoll, da der 'MyOption'-Wert mehrere Optionen enthalten kann, z. Es könnte sowohl ".Top" als auch ".Bottom" enthalten, also müssten mehrere Fälle übereinstimmen und eine Swift-Switch-Anweisung kann das nicht tun. Sie sollten 'if options.contains (.Top) {...} verwenden, wenn options.contains (.Bottom) {...}'. –

+0

Okay, ich sehe ~ Thx – SomnusLee

Verwandte Themen