2014-07-25 9 views
13

Używam API Wahoo biznesowe i określa następujące objective-c ENUM:Korzystanie non NS_ENUM objective-c enum w szybkim

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; 

nie mogę znaleźć sposób na wykorzystanie go w SWIFT. Najpierw próbowałem zrobić przełącznik/obudowę bez powodzenia. Jestem w punkcie, po prostu chcę, aby kontynuować i próbowałem następujące:

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

Ale nie skompilować:

'WFSensorConnectionStatus_t' is not convertible to 'NSObject' 

jakiegokolwiek obejścia? Przeczytałem, aby użyć WFSensorConnectionStatus_t.WF_SENSOR_CONNECTION_STATUS_IDLE lub WF_SENSOR_CONNECTION_STATUS_IDLE.value, ale nie działa w Xcode beta-4.

+0

Powinieneś kliknąć na 'WFSensorConnectionStatus_t', aby zobaczyć, w jaki sposób został on zaimportowany do Swift. To nie jest "NS_ENUM", ponieważ 'NS_ENUM' nie pojawia się w opublikowanym przez ciebie kodzie. – jtbandes

+0

Mam to samo pytanie, potrzebuję pomocy! – ZYiOS

Odpowiedz

15

Obejście, które należy zastosować .value, aby uzyskać bazową liczbę całkowitą, nie działa już tak jak w wersji Beta 4, jak powiedziałeś.

Niestety, enum nie można przenieść z Swift z Objective-C, musi to być NS_ENUM.

Mam taką samą konfigurację jak ty w projekcie, w którym potrzebuję enum ze struktury Objective-C i używam go w Swift.

Obejście zrobiłem było stworzenie kategorii Objective-C, który zawiera NS_ENUM i tam przenieść wartości z ram enum na własną rękę NS_ENUM.

Zaimportuj kategorię do swojego nagłówka pomostowego i powinieneś być w stanie używać standardu enum, jak zwykle.

coś takiego:

typedef NS_ENUM(NSUInteger, ConnectionStatus) { 
    ConnectionStatusIdle 
} 

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

Następnie powinieneś być w stanie go używać tak:

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

Oto ostateczna kompletne rozwiązanie:

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" 

Zastosowanie:

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

Zauważ, że nie jest typem CoreFoundation że jest podobny do NS_ENUM zwanego CF_ENUM. Używałem go w mojej strukturze, która jest głównie C. I tak, Swift tłumaczy to na enum Swift.

Istnieje również coś podobnego dla NS_OPTIONS o nazwie CF_OPTIONS.

3

C-style wylicza import w Swift jak UInt32. Więc można zrobić coś takiego:

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

UPD: W Swift 2.1 (Xcode 7.1 beta 2) wszystkie teksty stałe C-styl zgodny Equatable i obecnie można go używać jak:

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

Profit :)