在swift选项中访问NS_OPTIONS不可用

时间:2017-01-31 00:33:59

标签: ios objective-c swift enums bitmask

我在Objective-C .h文件中定义了一个NS_OPTIONS:

typedef NS_OPTIONS (NSInteger, Options){
    OptionsOne,
    OptionsTwo,
    OptionsThree
};

现在从Swift访问时:

public func myFunc() -> Options {
    return [.one, .two]
}

我收到此错误:

  

'one'不可用:使用[]构造一个空选项集。

但我没有收到.two或.three的错误。它似乎只适用于第一种选择。

2 个答案:

答案 0 :(得分:3)

默认情况下,在Swift 3中,NS_OPTIONS枚举等于0的名称不会导入Swift。你必须在Swift中使用[]才能得到它。

当您将enumerand的值更改为1时,名称已导入。

如果你考虑一下,这是完全合理的。 NS_OPTIONS用于位掩码。因此,如果(假设).one0.two1,则表达式[.one, .two]没有任何用处,因为没有添加任何信息由于.one

的存在

另一方面,你所做的是总是误用NS_OPTIONS,因为它不是位掩码。您的修改将其变为一个。 (Objective-C不会为你神奇地生成适合于bitmask的值。)

答案 1 :(得分:0)

我发现这个解决方案是在选项中添加显式位掩码值:

typedef NS_OPTIONS (NSInteger, Options){
    OptionsOne = 1 << 0,
    OptionsTwo = 1 << 1,
    OptionsThree = = 1 << 2
};

并且错误消失了。