【发布时间】:2016-01-20 07:42:51
【问题描述】:
我尝试在我的项目中使用 Objective-C 框架,但在将 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)
但我得到一个错误: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];
}
}
【问题讨论】:
标签: ios objective-c swift