在含有2个元素的NSArray上使用NSPredicate

时间:2014-02-16 07:49:53

标签: objective-c nsarray nspredicate

新手问题。

我有2个Class,它们都是NSObject,AddressBook类和AddressCard类的子类。

AddressBook已

@property (nonatomic, copy) NSMutableString *bookName;

@property (nonatomic , strong) NSMutableArray *book;

AddressCard

@property (nonatomic, copy) NSMutableString *name, *email;

我将addressCard实例放入AddressBook实例

.name和.email到书中。

所以我的main.m看起来像这样

AddressCard *card1 = [AddressCard new];
AddressCard *card2 = [AddressCard new];


[card1 setName:@"Tony Stevenson" andEmail:@"TnT213@mail.com"];
[card2 setName:@"Ian Hicks" andEmail:@"BBn12@mail.com"];

AddressBook *myBook = [[AddressBook alloc]initWithName:@"Roland's Address book"];

[myBook addCard:card1];
[myBook addCard:card2];

问题1,如何仅使用单行显示包含地址卡的数组?

我知道另一种方式(showList方法),但我很好奇为什么我的 NSLog(@"%@",myAddressBook.book)无效。并且只记录了这个:

my book (
    "<AddressCard: 0x1001083e0>",
    "<AddressCard: 0x10010a7a0>",)

- (void) showList{

   // NSLog(@"%@",book);

    NSLog(@"====== Contents of: %@ =======",bookName);


    for (AddressCard *theCard in book) {
        NSLog(@"%-20s    %-32s", [theCard.name UTF8String], 
                                 [theCard.email UTF8String] );
    }

    NSLog(@"===============================");
} 

问题2,How do I filter name on myAddressBook array using NSPredicate with Like parameter?

我试过但是XCode仍然抛出异常

//在这段代码中,我想过滤以stev

开头的.name元素
NSPredicate *execPredicate = [NSPredicate predicateWithFormat:@"SELF 
  contains[c] 'Stev'"];

  NSArray *Contain = [myBook.book filteredArrayUsingPredicate:execPredicate];

  NSLog(@"%@",Contain);

有人能就这个问题给我一些指导吗?谢谢你的回复。

1 个答案:

答案 0 :(得分:2)

NSLog(@"%@",myAddressBook.book)使用description方法打印数组元素,默认情况下会打印类名和地址。但是你可以 通过添加,覆盖description类中的AddressCard方法 跟随“AddressCard.m”(作为例子):

-(NSString *)description
{
    return [NSString stringWithFormat:@"name:%@ email:%@", self.name, self.email];
}

NSPredicate中,您必须指定进行过滤,例如:

[NSPredicate predicateWithFormat:@"name contains[c] 'Stev'"]

或更好

[NSPredicate predicateWithFormat:@"name contains[c] %@", @"Stev"]

即使搜索字词包含'等特殊字符,第二种形式仍然有用。