我不是来自xcode背景,而是来自java和c#。现在我正在尝试将我的应用程序更改为ios并且不确定我是否理解如何正确投射,或者更重要的是,xcodes问题是什么!
我正在尝试做一些非常简单的事情,从sqlite获取值并填充NSMutableDictionary对象。
我想得到像long,int和string这样的值,似乎我必须做各种各样的转换才能让编译器喜欢它。有人可以指出我正确的方向,因为我应该写的肯定这是必要的。
我的字典变量在本例中称为myDictionary。
将字符串添加到NSDictionary
[myDictionary setValue:[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(sqlStatement, 4)] forKey:@"myText"];
将int添加到NSDictionary
[myDictionary setValue: [[NSNumber alloc] initWithUnsignedInt:sqlite3_column_int(sqlStatement, 0)] forKey:@"myInt" ];
所有这些铸造真的是必要的吗?我以为我可以做这样简单的事情
将int添加到NSDictionary
[myDictionary setValue: sqlite3_column_int(sqlStatement, 0) forKey:@"myInt" ];
但是这句话
' int'隐式转换到了' id'不允许使用ARC
也试过
[myDictionary setValue: (int *)sqlite3_column_int(sqlStatement, 0) forKey:@"myInt" ];
但是我得到了
非Objective-C指针类型的隐式转换' int'到了' id'不允许使用ARC
我也尝试过同样的文字。如果我没有正确地做到这一点,有人请告诉我。
即便是这样的事也无效
int *myVar = sqlite3_column_int(sqlStatement, 0);
如果我也改变它
int myVar = sqlite3_column_int(sqlStatement, 0);
哪个确实有效,然后我无法将其填充到NSDictionary中作为此错误
[myDictionary setValue:myVar forKey:@"intValue"];
答案 0 :(得分:1)
是的,有些演员是必要的。很多这是因为你将sqlite的C接口与Objective C混合在一起,你必须观察什么是对象以及什么是基元。你的第一个例子(字符串)就是这样的。 NSString与C的char *有很大的不同。同样,NSNumber跟随它。但请注意,您只需进行一次演员表演,而且来自
const unsigned char *
到
char *
NSDictionaries应该只存储对象,而不是基元,因此你需要输入NSStrings和NSNumbers,而不是char *和int。
您不希望将指向原始数据的指针(如(int *))插入到NSDictionary中,首先将它们转换为对象,然后在再次获取它们时进行转换。
您可能会对自己有所帮助,例如:
[myMutableDictionary setValue: [NSNumber numberWithInt:2] forKey:@"mykey"];
希望这有帮助。