2016-01-20 2 views
1

Я пытаюсь использовать рамки Objective-C для своего проекта и иметь некоторые вопросы при преобразовании кода Objective-C в Swift.EXC_BAD_ACCESS при преобразовании кода Objective-C в Swift

Один из API:

- (void)ioFrameChannel:(PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(PTData*)payload 

payload.data это структура, как это:

typedef struct _PTExampleTextFrame { 
    uint32_t length; 
    uint8_t utftext[0]; 
} PTExampleTextFrame; 

Я хочу, чтобы получить PTExampleTextFrame.utftext которое сообщение отправить из рамок

Итак, создаю локацию struct:

struct CPTExampleTextFrame { 
    var length: UInt32 
    var utf8text: UnsafePointer<UInt8> 
} 

И писать так:

var textFrame = UnsafePointer<CPTExampleTextFrame>(payload.data).memory 
textFrame.length = CFSwapInt32(textFrame.length) 
print(textFrame.length) // textFrame.length is correct! 
let message = NSString(bytes: textFrame.utf8text, length: Int(textFrame.length), encoding: NSUTF8StringEncoding) // error 
print(message) 

But I get an error: EXC_BAD_ACCESS(code=1,address=0x31)

Может кто-нибудь сказать мне, в чем проблема?

А также я дам вам пример фреймворка, который находится в Objective-C:

- (void)ioFrameChannel:(PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(PTData*)payload { 
    if (type == PTExampleFrameTypeTextMessage) { 
    PTExampleTextFrame *textFrame = (PTExampleTextFrame*)payload.data; 
    textFrame->length = ntohl(textFrame->length); 
    NSString *message = [[NSString alloc] initWithBytes:textFrame->utf8text length:textFrame->length encoding:NSUTF8StringEncoding]; 
    [self appendOutputMessage:[NSString stringWithFormat:@"[%@]: %@", channel.userInfo, message]]; 
    } else if (type == PTExampleFrameTypePing && peerChannel_) { 
    [peerChannel_ sendFrameOfType:PTExampleFrameTypePong tag:tag withPayload:nil callback:nil]; 
    } 
} 

ответ

1

С Objective-C является подмножеством C, я очень рекомендую вам сохранить код, который взаимодействует с С, Код Objective-C. Взаимодействие C и Swift напрямую является абсолютной болью.

И массив символов и небезопасный изменяемый указатель на символ, очевидно, несовместимы.

+0

Спасибо за ваш совет! Наконец, я использовал метод Objective-C для построения сообщения, которое мне нужно, и это всего лишь занимает одну минуту ... Поэтому, я думаю, в некоторых ситуациях Swift не всегда является лучшим выбором в Swift Project. – Duelsol

0

Вам не нужно создать локальный-структуру, то распределение памяти не совместим с с типом.

После уточнения:

let x: PTExampleTextFrame = UnsafeMutablePointer<PTExampleTextFrame>(payload.data).memory

и использовать х, как вы будете

+0

Я пытался раньше, и я получил сообщение об ошибке 'Не удается преобразовать значение типа«UnsafeMutablePointer »(он же«UnsafeMutablePointer <()>») для указанного типа„PTExampleTextFrame“(он же„_PTExampleTextFrame“)'. После этого я использую local struct – Duelsol

+0

Как выглядит определение loadload.data? – Mindaugas

+0

Это (только для чтения) данные void *; – Duelsol

Смежные вопросы