2016-01-20 53 views
1

我尝试将Objective-C框架用于我的项目,并在将Objective-C代码转换为Swift时遇到一些问题。将Objective-C代码转换为Swift时EXC_BAD_ACCESS

其中的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的超集,我真的建议您保留以C接口,代码Objective-C代码。直接连接C和Swift是一件非常痛苦的事情。

而且char和一个不安全的可变指向char的数组显然不兼容。

+0

感谢您的咨询!最后,我使用了Objective-C方法来构建我需要的信息,并且只需要我一分钟......所以,我认为,在某些情况下,Swift并不总是Swift项目中的最佳选择。 – Duelsol

0

你并不需要创建一个本地结构,它的内存布局与C型兼容。

澄清后:

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

而且用x表示你会

+0

我以前试过,我得到了一个错误'不能类型的值“UnsafeMutablePointer ”(又名“UnsafeMutablePointer <()>”)转换为指定的类型‘PTExampleTextFrame’(又名‘_PTExampleTextFrame’)'。之后,我使用本地结构 – Duelsol

+0

payload.data定义的外观如何? – Mindaugas

+0

它是(只读)void * data; – Duelsol