我在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
,但仍然没有运气。
你有什么想法吗?
谢谢,
答案 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中进行了测试