如何从常量字符串中提取纯字符串

时间:2009-10-20 08:59:41

标签: objective-c cocoa

当我打印CFString常量的值时,例如控制台中的AddressBook标签,输出值为_$!<home>!$_。我如何只提取纯值,例如家?非常感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

如果要在界面中显示属性的名称,请使用the ABCopyLocalizedPropertyOrLabel functionthe ABPersonCopyLocalizedPropertyName function,而不是尝试从常量的私有实现详细信息值中提取名称。

如果您正在做这样的事情:

NSLog(@"%@: %@", kABURLsProperty, URLsValue);

请改为尝试:

//In a header
#define STRING_FROM_NAME(name) @#name

//In the implementation
NSLog(@"%@: %@", STRING_FROM_NAME(kABURLsProperty), URLsValue);

这将打印更常识别的常量名称,而不是常量的私有实现细节值。

(注意,由于这是一个预处理器宏,它不会跟随变量。它只是从您传递的任何文本中创建一个字符串作为第一个参数;它不会尝试反转 - 查找字符串。因此,如果传递变量名,您将在输出中获得变量的名称。)

答案 1 :(得分:4)

并非所有字符串常量都包含所有gubbins - 只是有人决定通讯录的那些。因此,我认为没有任何内置函数可以删除它们。

这使得这个问题变得简单“如何删除字符?”题。有很多解决方案,但一个简单的解决方案是:

NSString *label = @"_$!<home>!$_";

NSString *rawLabel = [[label stringByReplacingOccurrencesOfString:@"_$!<" withString:@""] 
                    stringByReplacingOccurrencesOfString:@">!$_" withString:@""];

答案 2 :(得分:3)

使用:

NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(contact, index));

答案 3 :(得分:-2)

这里是我使用的代码段,因为ABCopyLocalizedPropertyOrLabel目前只是Mac OS X:

NSString *labelTranslation = @"";
if ([label isEqualToString:@"_$!<Home>!$_"])
    labelTranslation = @"Home";
else if ([label isEqualToString:@"_$!<Mobile>!$_"])
    labelTranslation = @"Mobile";
else if ([label isEqualToString:@"_$!<Work>!$_"])
    labelTranslation = @"Work";
else if ([label isEqualToString:@"_$!<WorkFAX>!$_"])
    labelTranslation = @"Work (Fax)";
else if ([label isEqualToString:@"_$!<Main>!$_"])
    labelTranslation = @"Main";
else if ([label isEqualToString:@"_$!<HomeFAX>!$_"])
    labelTranslation = @"Home (Fax)";
else if ([label isEqualToString:@"_$!<Pager>!$_"])
    labelTranslation = @"Pager";
else if ([label isEqualToString:@"_$!<Other>!$_"])
    labelTranslation = @"Other";