RawOptionSetType兼容Objective-C吗?

时间:2015-06-08 05:30:34

标签: ios objective-c swift

我最近发现了在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'

这是一个已知问题吗?有解决方法吗?

1 个答案:

答案 0 :(得分:1)

您无法将Swift中的结构体暴露给ObjectiveC。实际上,看一下-Swift.h文件,看看你可以从Objective访问什么。你不会在那里找到MySwiftOptions。

  

您可以访问类或协议中的任何内容   标有@objc属性,只要它兼容   Objective-C的。这不包括仅限Swift的功能,例如列出的功能   这里:

     

Generics Tuples,

     

Swift中定义的枚举,

     

Swift中定义的结构,

     

Swift中定义的顶级函数,

     

Swift中定义的全局变量,

     

Swift中定义的Typealiases,

     

Swift风格的可变参数嵌套类型

     

咖喱功能

我是一个人,每天都有这些限制。

Using Swift with Cocoa and Objective-C at Apple.