Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将Objective-C代码转换为Swift时的EXC_错误访问_Ios_Objective C_Swift - Fatal编程技术网

Ios 将Objective-C代码转换为Swift时的EXC_错误访问

Ios 将Objective-C代码转换为Swift时的EXC_错误访问,ios,objective-c,swift,Ios,Objective C,Swift,我尝试在我的项目中使用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 {

我尝试在我的项目中使用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;
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)
我想获取从框架发送的消息
PTExampleTextFrame.utftext

因此,我创建了一个本地
结构

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

您不需要创建本地结构,它的内存布局与c类型不兼容

澄清后:

让x:PTExampleTextFrame=unsafemeutablepointer(payload.data).memory


既然Objective-C是C的超集,我真的建议您将与C接口的代码保留为Objective-C代码。直接与C和Swift接口绝对是一件痛苦的事


字符数组和指向字符的不安全可变指针显然是不兼容的

我以前尝试过,但遇到一个错误
无法将类型为“UnsaFemeutablePointer”(又名“UnsaFemeutablePointer”)的值转换为指定的类型“PTExampleTextFrame”(又名“_PTExampleTextFrame”)
。之后我使用本地结构payload.data定义是什么样子的?在这种情况下更新了我的答案当我按下cmd+r时,我得到一个错误“由于信号:分段错误:11导致命令失败”,这意味着什么?谢谢你的建议!最后,我使用Objective-C方法来构建我需要的消息,这只需要一分钟。。。因此,我认为,在某些情况下,Swift并不总是Swift项目的最佳选择。
- (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];
  }
}