【问题标题】:Casting from C/C++ types to Objc types从 C/C++ 类型转换为 Objc 类型
【发布时间】:2015-11-01 05:11:03
【问题描述】:

我目前正在做一个需要一些 objc 绑定的项目。虽然我不是 iOs 专家,但到目前为止我做得很好。

我需要将一些 C++ 类型转换为 Objc 类型:

std::streamsize read(uint32_t *buffer) {
    return _read(buffer, sizeof(uint32_t));
}

std::streamsize read(double *buffer) {
    return _read(buffer, sizeof(double));
}

std::streamsize read(std::string *buffer) {
    return _read(buffer, sizeof(std::string));
}

template<typename T>
std::streamsize _read(T *buffer, std::streamsize length) {
     NSString* buff = (__bridge NSString *)buffer;
    return [_memoryAdapter read:buff withLength:length];
}

我收到以下错误:

Incompatible types casting 'unsigned int *' to 'NSString *' with a __bridge cast.
Incompatible types casting 'double *' to 'NSString *' with a __bridge cast.

看来我的演员阵容几乎都失败了,除了 std::string 之一。

我是否使用了 __bridge 错误?经过一番研究,我确实发现它用于将 C 和 C++ 类型转换为 Objc。谁能给我一个关于我的错误的答案、提示或/和解释?我还查看了堆栈溢出以查找任何可能的重复或进一步建议,但找不到任何东西。

提前致谢

编辑:我需要读取缓冲区并将读取的字节存储到指针中,这就是我尝试将其转换为 NSMutableString 的原因。

- (NSInteger) read:(NSMutableString *)buffer withLength:(NSInteger)length {
const char* fileBytes = (const char*)[self._buffer bytes];
NSUInteger index;

for (index = 0; index< [self._buffer length]; index++)
{
    if (index >= self._cursor) {
        NSString *aByte  = [NSString stringWithFormat:@"%c", fileBytes[index]];
        [buffer appendString:aByte];
    }
    if (index >= self._cursor + length)
        break;
}
self._cursor += length;
return length;

}

【问题讨论】:

  • 为什么您认为可以将unit32_t *double * 转换为NSString *?这没有任何意义。
  • 显示您在 _memoryAdaptor 上调用的 read:withLength:` 方法的声明。
  • 再一次,这完全没有意义。 buffer 实际上可能是 double *。您怎么可能将其视为可以附加的可变字符串?您似乎想将 sizeof(double) 字节从 self._buffer 读入 buffer 以获得 double 值。使用NSString(或NSMutableString)对此毫无意义。
  • 我想我现在明白了,感觉有点愚蠢和羞愧。我从不需要强制转换这些类型(可能除了 std::string 之外),因为我可以将读取的值附加到原始缓冲区中。我只需要模板化我的 Objc 方法,而不是尝试强制转换我的 C++ 参数以在我的 Objc 代码上只创建一种方法。
  • 请不要感到愚蠢或羞耻。您不应该知道自己问题的答案。用户之间的 SO 语气差异很大,即使对于同一用户,根据他/她当天的心情也是如此。如果您已经解决了这个问题,请发布一个答案,显示您想要的代码,并解释它是如何工作的。重点是让问答对未来的读者有用。

标签: objective-c casting bridge


【解决方案1】:

使用 NSNumber 类集群,它使您能够轻松地从任何类型执行指向整数转换的指针:

[[NSNumber numberWithUnsignedInt:buffer] integerValue]

const char *index_pointer = [[NSString stringWithFormat:@"%lu", index]] cStringUsingEncoding:NSUTF8StringEncoding];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多