首页 文章

为什么这个类型不适用?

提问于
浏览
0

我好像找到了解决办法 . 在我的应用程序中,我通过创建日期唯一地标识来自 ABAddressBook 的联系人,因为不能同时创建两个联系人 . 在我的应用程序中,创建日期存储在名为 uid 的字符串中,如下所示 . 我正在检查两个联系人是否相同,我通过执行以下条件语句来执行此操作:

NSString *uid = @"some string";

if([(__bridge_transfer NSString *)ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty) isEqualToString:uid]) {

    //Do some code
}

但是,当我运行此代码时,我收到以下错误:

[__NSDate isEqualToString:]:无法识别的选择器发送到实例0x8c7c770

我很确定问题是 ABRecordCopyValue() 正在返回一个未被 (__bridge_transfer NSString *) 转换为 NSString 的NSDate对象,因此当我使用 isEqualToString 将其与 uid 进行比较时,它会崩溃 . 问题是,我认为通过将其转换为NSString对象, isEqualToString: 将起作用 . 我的问题是:

为什么(__bridge_transfer NSString *)没有强制转换NSDate对象?


编辑:

提供的答案很有用,但它们并没有完全解决我的问题(实际上它们确实存在,但我有一个后续问题) . 在我的代码的另一部分,我运行这个:

NSString *uid = (__bridge_transfer NSString *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);

如果我NSLog uid 我得到这个:

2012-10-28 21:55:29 0000

那么如果 isEqualToString: 不起作用,我将如何比较上述条件语句中的 uid

2 回答

  • 5

    强制转换永远不会更改对象的类或类型 . 它只是告诉编译器,你确定这个对象是另一种类型的事实,而不是编译器可能假设的那样 .

    因此,如果将日期对象强制转换为字符串,它仍将是日期对象 .

    在OOP中,您通常需要向上转换:一个方法希望您传入一个对象,但实际上您传入了一个子类的对象 . 如果您需要访问由子类定义的属性或方法,您将通过强制转换告诉编译器您有子类的对象 .
    iOS中一个非常常见的例子是带有子类化单元格的 tableview:cellForRowAtIndexPath: .

    在cocoa(-touch)中你也知道从toll-free bridging进行的转换 . 有关有效的演员表,请参阅此文档 .


    提供的答案很有用,但它们并没有完全解决我的问题(事实上他们确实如此,但我有一个后续问题) . 在我的代码的另一部分,我运行这个:NSString * uid =(__ bridge_transfer NSString *)ABRecordCopyValue(currentPerson,kABPersonCreationDateProperty);
    如果我NSLog uid我得到这个:2012-10-28 21:55:29 0000

    您正在创建一个声明为NSString的变量,但实际上您指定给它的对象是一个日期对象 .

    NSDate *uidDate = (__bridge_transfer NSDate *)ABRecordCopyValue(currentPerson, kABPersonCreationDateProperty);
    
    NSString *uid = [NSString stringWithFormat:uidDate];
    
  • 0

    好吧,我不知道你的问题的答案,但为什么不把ABRecordCopyValue()转换为NSString,然后做isStringEqual:?

    喜欢 -

    NSString *string = [NSString stringWithFormat:@"%@", ABRecordCopyValue(currentPersonRef, kABPersonCreationDateProperty)];
    if([string isEqualToString: uid]){
        //do your thing
    }
    

相关问题