2014-07-25 116 views
13

使用非NS_ENUM目标-C枚举我现在用的是嗬健身API,它定义了以下目标-C枚举:在迅速

typedef enum 
{ 
    /** No active connection. */ 
    WF_SENSOR_CONNECTION_STATUS_IDLE, 
    /** The connection is in process of being established. */ 
    WF_SENSOR_CONNECTION_STATUS_CONNECTING, 
    /** The sensor connection is established and active. */ 
    WF_SENSOR_CONNECTION_STATUS_CONNECTED, 
    /** The connection was interrupted (usually occurs when fisica is disconnected). */ 
    WF_SENSOR_CONNECTION_STATUS_INTERRUPTED, 
    /** The connection is in process of being disconnected. */ 
    WF_SENSOR_CONNECTION_STATUS_DISCONNECTING, 

} WFSensorConnectionStatus_t; 

我不能找到一种方式,迅速使用它。我第一次试图做一个开关/案件没有成功。我是在一个点上我只是想继续和尝试了以下内容:

var connState : WFSensorConnectionStatus_t = WF_SENSOR_CONNECTION_STATUS_IDLE 
... 
if(connState == WF_SENSOR_CONNECTION_STATUS_IDLE){ 

不过,这并不编译:

'WFSensorConnectionStatus_t' is not convertible to 'NSObject' 

什么解决办法?我读过使用WFSensorConnectionStatus_t.WF_SENSOR_CONNECTION_STATUS_IDLEWF_SENSOR_CONNECTION_STATUS_IDLE.value,但它在xcode beta-4中不起作用。

+0

你应该⌘-点击'WFSensorConnectionStatus_t'来看它是如何被导入到Swift中的。这不是'NS_ENUM',因为'NS_ENUM'没有出现在你发布的代码中。 – jtbandes

+0

我有同样的问题,需要帮助! – ZYiOS

回答

15

正如您所说,使用.value获取底层整数的解决方法不再适用于Beta 4。

不幸的是enum不能从Objective-C转移到Swift,它需要是NS_ENUM

我和你在一个项目中的设置相同,我需要Objective-C框架中的enum并在Swift中使用它。

我做的解决方法是创建一个包含NS_ENUM一个Objective-C类和有我从框架enum传递的价值观我自己NS_ENUM

在您的桥接头中导入类别,您应该可以像平常一样使用enum

事情是这样的:

typedef NS_ENUM(NSUInteger, ConnectionStatus) { 
    ConnectionStatusIdle 
} 

- (ConnectionStatus)connectionStatus { 
    if [self getConnectionStatus] == WF_SENSOR_CONNECTION_STATUS_IDLE { 
     return ConnectionStatusIdle 
    } 
} 

那么你应该能够使用这样的:

switch myObject.connectionStatus() { 
    case .Idle: 
     // do something 
     break 
} 
2

这里是最后的完整的解决方案:

WFSensorConnection+SensorConnectionEnumCategory.h 

#import <Foundation/Foundation.h> 

#import <WFConnector/WFConnector.h> 

@interface WFSensorConnection (SensorConnectionEnumCategory) 

typedef NS_ENUM(NSUInteger, ConnectionStatus) { 
    ConnectionStatusIdle, 
    ConnectionStatusConnecting, 
    ConnectionStatusConnected, 
    ConnectionStatusInterrupted, 
    ConnectionStatusDisconnecting 
}; 

- (ConnectionStatus) swift_connectionStatus; 

@end 

WFSensorConnection+SensorConnectionEnumCategory.m 

#import "WFSensorConnection+SensorConnectionEnumCategory.h" 

@implementation WFSensorConnection (SensorConnectionEnumCategory) 

- (ConnectionStatus) swift_connectionStatus{ 
    if ([self connectionStatus] == WF_SENSOR_CONNECTION_STATUS_IDLE){ 
     return ConnectionStatusIdle; 
    } else if ([self connectionStatus] == WF_SENSOR_CONNECTION_STATUS_CONNECTING){ 
     return ConnectionStatusConnecting; 
    } else if ([self connectionStatus] == WF_SENSOR_CONNECTION_STATUS_CONNECTED){ 
     return ConnectionStatusConnected; 
    } else if ([self connectionStatus] == WF_SENSOR_CONNECTION_STATUS_DISCONNECTING){ 
     return ConnectionStatusDisconnecting; 
    } else if ([self connectionStatus] == WF_SENSOR_CONNECTION_STATUS_INTERRUPTED){ 
     return ConnectionStatusInterrupted; 
    } 
    return 0; 
} 

@end 

Bridging-Header.h 

#import "WFSensorConnection+SensorConnectionEnumCategory.h" 

用法:

var sensorConnection: WFSensorConnection? 
var connState : ConnectionStatus = ConnectionStatus.Idle 
connState = sensorConnection!.swift_connectionStatus() 
switch connState { 
    case ConnectionStatus.Idle: 
... 
} 
0

注意,有一种类型的CoreFoundation是类似于NS_ENUM称为CF_ENUM。我在我的框架中使用它,主要是C.是的,Swift会将它转换为Swift枚举。

NS_OPTIONS也有类似的东西叫做CF_OPTIONS

3

C样式枚举在Swift中导入,如UInt32。所以,你可以这样做:

let state = unsafeBitCast(WF_SENSOR_CONNECTION_STATUS_IDLE, UInt32.self) 
if state == unsafeBitCast(WF_SENSOR_CONNECTION_STATUS_IDLE, UInt32.self) { 
    //do something 
} 

UPD:在雨燕2.1(7.1 Xcode的测试版2)所有C风格的枚举符合Equatable,您现在可以使用它像:

let state = WF_SENSOR_CONNECTION_STATUS_IDLE 
if state == WF_SENSOR_CONNECTION_STATUS_IDLE { 
    //do something 
} 

利润:)