【发布时间】: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