我最近发现了在Swift中创建NS_OPTIONS
等效的方法,但我不能在Objective-C / Swift项目中使用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'
。
这是一个已知问题吗?有解决方法吗?
答案 0 :(得分:1)
您无法将Swift中的结构体暴露给ObjectiveC。实际上,看一下-Swift.h文件,看看你可以从Objective访问什么。你不会在那里找到MySwiftOptions。
您可以访问类或协议中的任何内容 标有@objc属性,只要它兼容 Objective-C的。这不包括仅限Swift的功能,例如列出的功能 这里:
Generics Tuples,
Swift中定义的枚举,
Swift中定义的结构,
Swift中定义的顶级函数,
Swift中定义的全局变量,
Swift中定义的Typealiases,
Swift风格的可变参数嵌套类型
咖喱功能
我是一个人,每天都有这些限制。