簡體   English   中英

在swift中使用非NS_ENUM objective-C枚舉

[英]Using non NS_ENUM objective-C enum in swift

我正在使用wahoo fitness API,它定義了以下Objective-C enum:

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;

我無法找到一種在swift中使用它的方法。 我首先嘗試在其上做一個開關/案例但沒有成功。 我只是想繼續並嘗試以下方面:

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中不起作用。

正如您所說,使用.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
}

這是最終的完整解決方案:

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:
...
}

UInt32一樣在Swift中導入C風格的枚舉。 所以你可以這樣做:

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

更新:在Swift 2.1(Xcode 7.1 beta 2)中,所有C風格的枚舉都符合Equatable ,你現在可以使用它:

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

利潤:)

請注意,CoreFoundation類型與NS_ENUM類似,稱為CF_ENUM 我在我的主要是C的框架上使用它。是的,Swift確實將它轉換為Swift枚舉。

也有類似的東西, NS_OPTIONS稱為CF_OPTIONS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM