2014-07-25 114 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 
} 

利潤:)