2015-06-08 41 views
4

我最近發現了在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'

這是一個已知的問題嗎?有沒有解決方法?

+0

您是否添加了橋接頭文件? –

+0

需要我嗎?我認爲我不需要它:我不會將Objective-C導入Swift。但是我導入了'* -Swift.h'文件。 '[SwiftObject sayHello];'工作正常。 –

回答

1

無法將結構從Swift公開到ObjectiveC。實際上,查看-Swift.h文件以查看您可以從Objective訪問的內容。你不會在那裏找到MySwiftOptions。

你有一個類或協議,這是 標有@objc屬性,只要它與 Objective-C的兼容中獲得什麼。這不包括斯威夫特獨有特性,如這裏列出 :

泛型元組,在斯威夫特定義

斯威夫特定義枚舉,

結構,在斯威夫特定義

頂級功能,在斯威夫特定義

全局變量,定義瑞士法郎

類型別名IFT,

斯威夫特式variadics嵌套類型,

咖喱功能

我來說,我對每天基地這些限制居住。

Using Swift with Cocoa and Objective-C at Apple.

+0

廢話,我忘了!這說得通。感謝您的記憶! –