我最近发现了在Swift中创建相当于NS_OPTIONS
的方法,但是我无法从Objective-C/Swift项目中的Objective-C代码中使用它们。是RawOptionSetType兼容Objective-C吗?
下面是一个简单的项目,我做的事:
ObjcObject.h & ObjcObject.m
typedef NS_OPTIONS(NSUInteger, MyObjcOption)
{
MyOptionNone = 0,
MyObjcOptionCase01 = 1 << 0,
MyObjcOptionCase02 = 1 << 1,
MyObjcOptionCaseAll = MyObjcOptionCase01 | MyObjcOptionCase02
};
@interface ObjcObject : NSObject
+ (void)printMyObjcOption:(MyObjcOption)option;
@end
@implementation ObjcObject
+ (void)printMyObjcOption:(MyObjcOption)option
{
if (option == 0)
NSLog(@"None");
if (option & MyObjcOptionCase01)
NSLog(@"MyObjcOptionCase01");
if (option & MyObjcOptionCase02)
NSLog(@"MyObjcOptionCase02");
}
@end
SwiftObject.swift
struct MySwiftOption: RawOptionSetType, BooleanType {
private var value: UInt = 0
var rawValue: UInt { return self.value }
init(_ value: UInt) { self.value = value }
init(rawValue value: UInt) { self.value = value }
init(nilLiteral:()) { self.value = 0 }
var boolValue: Bool { return value != 0 }
static var allZeros: MySwiftOption { return self(0) }
static var None: MySwiftOption { return self(0) }
static var All: MySwiftOption { return self.Case01 | self.Case02 }
static var Case01: MySwiftOption { return self(1 << 0) }
static var Case02: MySwiftOption { return self(1 << 1) }
}
public class SwiftObject: NSObject {
class func printMySwiftOption(option: MySwiftOption) {
if option.rawValue == 0 {
println("None")
}
if option & MySwiftOption.Case01 {
println(".Case01")
}
if option & MySwiftOption.Case02 {
println(".Case02")
}
}
class func sayHello() {
println("Hello")
}
}
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
MyObjcOption objcOption = MyObjcOptionCase02;
[ObjcObject printMyObjcOption:objcOption];
[SwiftObject sayHello];
// MySwiftOption swiftOption = MySwiftOptionCase02; // Error: Use of undeclared identifier 'MySwiftOption'
// [SwiftObject printMySwiftOption:swiftOption];
return YES;
}
在Objective-C代码中,我总是得到一个错误Use of undeclared identifier 'MySwiftOption'
。
这是一个已知的问题吗?有没有解决方法?
您是否添加了桥接头文件? –
需要我吗?我认为我不需要它:我不会将Objective-C导入Swift。但是我导入了'* -Swift.h'文件。 '[SwiftObject sayHello];'工作正常。 –