首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用非NS_ENUM目标-C枚举

使用非NS_ENUM目标-C枚举
EN

Stack Overflow用户
提问于 2014-07-25 04:29:53
回答 4查看 8.5K关注 0票数 14

我正在使用wahoo健身API,它定义了以下目标-C enum:

代码语言:javascript
复制
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;

我想不出用什么方法在斯威夫特。我第一次试着对它做一个开关/箱子,但没有成功。我现在只想继续做下去,尝试以下几点:

代码语言:javascript
复制
var connState : WFSensorConnectionStatus_t = WF_SENSOR_CONNECTION_STATUS_IDLE
...
if( connState == WF_SENSOR_CONNECTION_STATUS_IDLE){

但它没有编译:

代码语言:javascript
复制
'WFSensorConnectionStatus_t' is not convertible to 'NSObject'

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-25 07:36:40

使用.value获取基本整数的解决方法不再像您所说的那样,从Beta 4开始工作。

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

在一个项目中,我需要来自Objective框架的enum,并在Swift中使用它,我的设置与您相同。

我所做的解决办法是创建一个包含NS_ENUM的Objective类别,并在那里将值从框架enum传递到我自己的NS_ENUM

导入桥接标题中的类别,您应该能够像通常那样使用enum

就像这样:

代码语言:javascript
复制
typedef NS_ENUM(NSUInteger, ConnectionStatus) {
    ConnectionStatusIdle
}

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

那么您应该能够像这样使用它:

代码语言:javascript
复制
switch myObject.connectionStatus() {
    case .Idle:
        // do something
        break
}
票数 18
EN

Stack Overflow用户

发布于 2014-07-26 03:25:41

以下是最终的完整解决方案:

代码语言:javascript
复制
WFSensorConnection+SensorConnectionEnumCategory.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
WFSensorConnection+SensorConnectionEnumCategory.m

代码语言:javascript
复制
#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

代码语言:javascript
复制
Bridging-Header.h

代码语言:javascript
复制
#import "WFSensorConnection+SensorConnectionEnumCategory.h"

用法:

代码语言:javascript
复制
var sensorConnection: WFSensorConnection?
var connState : ConnectionStatus = ConnectionStatus.Idle
connState = sensorConnection!.swift_connectionStatus()
switch connState {
    case ConnectionStatus.Idle:
...
}
票数 4
EN

Stack Overflow用户

发布于 2015-09-22 13:38:55

C风格枚举在像UInt32这样的Swift中导入。所以你可以做这样的事情:

代码语言:javascript
复制
let state = unsafeBitCast(WF_SENSOR_CONNECTION_STATUS_IDLE, UInt32.self)
if state == unsafeBitCast(WF_SENSOR_CONNECTION_STATUS_IDLE, UInt32.self) {
    //do something
}

Upd:在SWIFT2.1 (Xcode 7.1 beta 2)中,所有C风格枚举都符合Equatable,您现在可以这样使用它:

代码语言:javascript
复制
let state = WF_SENSOR_CONNECTION_STATUS_IDLE
if state == WF_SENSOR_CONNECTION_STATUS_IDLE {
    //do something
}

利润:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24948082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档