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

qua*_*yen 4 enums objective-c nsnumber swift

我在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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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.
}
Run Code Online (Sandbox Code Playgroud)

}

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

错误是:

无法使用类型'(char:Int)'的参数列表调用'init'

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

你有什么想法?

谢谢,

Ner*_*ero 9

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


enum 在Swift中创建

// 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
Run Code Online (Sandbox Code Playgroud)

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


enum 在Objective-C中创建

Objective-C的

enum TestEnum {
    A = 0,
    B = 1,
    C = 2
};
Run Code Online (Sandbox Code Playgroud)

迅速

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

Swift枚举的不同之处似乎是你必须使用.value而不是.rawValue你不能用它们作为前缀.在这种情况下的原始类型是UInt32.

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

  • @quanguyen可以通过很多方式定义枚举,因此这更适合新问题.在`enum TypeName {...} instanceName;`中省略`TypeName`,你基本上定义一个名为`instanceName`的新**变量**,类型为`enum {...}`,而类型本身不是得到一个名字.快速搜索,我发现[这个C++参考](http://www.cplusplus.com/doc/tutorial/other_data_types/#enumerated_types),它应该与Obj-C枚举非常相似,因为两种语言都继承了它们来自C.或者你可以在StackOverflow上找到一个现有的问题. (2认同)