从混合语言项目中的枚举元素初始化NSNumber

时间:2014-12-12 09:59:48

标签: objective-c swift enums nsnumber

我在XCode 6中有一个混合语言项目Objective C和Swift。

Singleton.h

#import <Foundation/Foundation.h>

enum  {
    enum_A = 0,
    enum_B,
    enum_C,
    enum_D,
    enum_E,
    enum_F,
    enum_G,
} enums;

@interface Singleton : NSObject

+ (id)sharedSingleton;

@end

Singleton.m

// Nothing's special in this file

#import "Singleton.h"

static Singleton *shared = nil;

@implementation Singleton

- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

#pragma mark - Interface

+ (Singleton *)sharedSingleton {
    static dispatch_once_t pred;

    dispatch_once(&pred, ^{
        shared = [[Singleton alloc] init];
    });

    return shared;
}

@end

ViewController.swift

import UIKit

class ViewController: UIViewController {

let singleton = Singleton.sharedSingleton() as Singleton

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let n = NSNumber(char: enum_E) // ERROR HERE!!!
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

(当然我必须设置桥接头文件,添加#import "Singleton.h")。

错误是:

  

无法使用类型为'(char:Int)'

的参数列表调用'init'

奇怪的是,Swift仍然可以识别enum_E(我看到它用蓝色着色)但仍会弹出这个错误。 我试过(char)enum_E,但仍然没有运气。

你有什么想法吗?

谢谢,

1 个答案:

答案 0 :(得分:9)

好吧,显然在Objective-C和Swift中创建的枚举之间存在差异。我认为没有区别,因此我只在Swift游乐场测试了我的方法。

<小时/> 在Swift中创建的 enum

// UInt32 used to have the same underlying type in both examples
enum TestEnum : UInt32 { 
    case A, B, C
}

var x = NSNumber(unsignedInt: TestEnum.C.rawValue)
// x == 2

要从Swift中的枚举值中获取原始值,您必须将枚举值显式转换为原始值。这可以通过在您的枚举值中添加.rawValue来完成。

<小时/> 在Objective-C中创建的 enum

目标-C

enum TestEnum {
    A = 0,
    B = 1,
    C = 2
};

夫特

let x : TestEnum = C
var number = NSNumber(unsignedInt: C.value) // alternative: x.value
println("the number is \(number)")
// Outputs: the number is 2

与Swift枚举的不同之处似乎在于您必须使用.value而不是.rawValue,并且不能为它们添加类型前缀。在这种情况下,原始类型为UInt32

在Xcode 6.1.1,iOS SDK 8.1,iOS模拟器8.1中进行了测试