Я печатаю пару перечислений в методах делегата для WebRTC. Их сравнение или использование операторов switch работает нормально, но одно из перечислений просто печатает имя своего типа вместо связанного значения:
func peerConnection(_ peerConnection: RTCPeerConnection, didChange newState: RTCPeerConnectionState) {
// I don't know why this only prints the type name and not the associated value
print ("peerConnectionState \(newState)")
}
func peerConnection(_ peerConnection: RTCPeerConnection, didChange newState: RTCIceConnectionState) {
print("ICEConnectionState: \(newState)")
}
Это печатает
peerConnectionState: RTCPeerConnectionState
ICEConnectionState: connected
RTCPeerConnectionState никогда не печатает связанное с ним значение, даже если я проверю его rawValue, это действительный член перечисления. Оба они определены в PeerConnectionState.h, как показано ниже:
/** Represents the ice connection state of the peer connection. */
typedef NS_ENUM(NSInteger, RTCIceConnectionState) {
RTCIceConnectionStateNew,
RTCIceConnectionStateChecking,
RTCIceConnectionStateConnected,
RTCIceConnectionStateCompleted,
RTCIceConnectionStateFailed,
RTCIceConnectionStateDisconnected,
RTCIceConnectionStateClosed,
RTCIceConnectionStateCount,
};
/** Represents the combined ice+dtls connection state of the peer connection. */
typedef NS_ENUM(NSInteger, RTCPeerConnectionState) {
RTCPeerConnectionStateNew,
RTCPeerConnectionStateConnecting,
RTCPeerConnectionStateConnected,
RTCPeerConnectionStateDisconnected,
RTCPeerConnectionStateFailed,
RTCPeerConnectionStateClosed,
};
Я не очень разбираюсь в мостах ObjC-Swift, все вроде «просто работает». В чем разница между двумя перечислениями, которые влияют только на print ()?
Очевидно, если вы определите свои перечисления в Objective C с помощью NS_ENUM и назовете их правильно, LLVM сделает их доступными в Swift «бесплатно» stackoverflow.com/questions/24872475/…. Оба перечисления выше работают таким образом, Xcode даже автоматически генерирует блоки переключателей со всеми значениями перечисления, проблема, похоже, ограничивается print ()
Упс - вы были правы, Александр, в образце кода, с которого я начал, был файл, который имеет именно то, что вы описываете, и в нем отсутствовал рассматриваемый класс. Я ошибочно принимал Swift, соединяющий метки перечисления со строками описания.





Я не думаю, что код ObjC хранит эти метаданные. Я думаю, вам нужно вручную расширить эти перечисления в соответствии с
CustomStringDescribable, добавить вычисляемое свойствоdescription, которое использует переключатель значения перечисления для возврата правильного (жестко закодированная строка) имени случая.