[英]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_IDLE
或WF_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.