捷径系列:NSString
该系列文章来自http://borkware.com/quickies/。无论是学习还是开发都可以从这里获得很多有用的代码段,从而省去了很多调查和搜索的时间。
1 合并一个字符串数组到单个字符串。
- NSArray *chunks = ... get an array, say by splitting it;
- string = [chunks componentsJoinedByString: @" :-) "];
输出结果如下:
- oop :-) ack :-) bork :-) greeble :-) ponies
2 将一个字符串分割成数组
- NSString *string = @"oop:ack:bork:greeble:ponies";
- NSArray *chunks = [string componentsSeparatedByString: @":"];
3 将字符串转换成整型数
- NSString *string = ...;
- int value = [string intValue];
同样NSString也有floatValue和doubleValue的方法。
4 遍历属性字符串(Attributed string)中的属性
如下函数可以打印出输入的属性字符串中的所有属性
- - (void) iterateAttributesForString: (NSAttributedString *) string
- {
- NSDictionary *attributeDict;
- NSRange effectiveRange = { 0, 0 };
- do {
- NSRange range;
- range = NSMakeRange (NSMaxRange(effectiveRange),
- [string length] - NSMaxRange(effectiveRange));
- attributeDict = [string attributesAtIndex: range.location
- longestEffectiveRange: &effectiveRange
- inRange: range];
- NSLog (@"Range: %@ Attributes: %@",
- NSStringFromRange(effectiveRange), attributeDict);
- } while (NSMaxRange(effectiveRange) < [string length]);
- }
5 制作本地化的字符串
你需要在English.lproj目录(或其他合适的本地化目录)中有一个名为Localizable.strings的文件。它有如下的语法:
- "BorkDown" = "BorkDown";
- "Start Timer" = "Start Timer";
- "Stop Timer" = "Stop Timer";
也就是,每个键值都有一个本地化的值。
在代码中,可以使用NSLocalizedString()或其变种。
- [statusItem setTitle: NSLocalizedString(@"BorkDown", nil)];
其中该函数忽略了第二个参数。
6 无多余信息的NSLog
NSlog在日志行之前输出了太多无关信息。对于一个用于输出的基础工具,它确实有点碍事。不过我仍然和喜欢printf()系列所不能的%@展开替换。如下是可以实现该功能的代码:
- #include <stdarg.h>
- void LogIt (NSString *format, ...)
- {
- va_list args;
- va_start (args, format);
- NSString *string;
- string = [[NSString alloc] initWithFormat: format arguments: args];
- va_end (args);
- printf ("%s\n", [string cString]);
- [string release];
- }
7 在属性字符串中加入图片
我们需要使用一个文本附件:
- - (NSAttributedString *) prettyName
- {
- NSTextAttachment *attachment;
- attachment = [[[NSTextAttachment alloc] init] autorelease];
- NSCell *cell = [attachment attachmentCell];
- NSImage *icon = [self icon]; // or wherever you are getting your image
- [cell setImage: icon];
- NSString *name = [self name];
- NSAttributedString *attrname;
- attrname = [[NSAttributedString alloc] initWithString: name];
- NSMutableAttributedString *prettyName;
- prettyName = (id)[NSMutableAttributedString attributedStringWithAttachment:
- attachment]; // cast to quiet compiler warning
- [prettyName appendAttributedString: attrname];
- return (prettyName);
- }
这样就可以在字符串前面加入图片。如果需要在字符串中加入图片就需要创建通过附件创建一个属性字符串,然后将其加入到最终的属性字符串中。
8 除去字符串中的换行符
假定有一个字符串,你想除去换行符。你可以像脚本语言一样进行一个分割/合并操作,或者制作一个可变的拷贝并进行处理:
- NSMutableString *mstring = [NSMutableString stringWithString:string];
- NSRange wholeShebang = NSMakeRange(0, [mstring length]);
- [mstring replaceOccurrencesOfString: @"
- withString: @""
- options: 0
- range: wholeShebang];
- return [NSString stringWithString: mstring];
(这也可用于通用的字符串操作,不仅经是除去换行符)
该方法比分割/合并至少省一半的时间。当然可能结果不会造成太多的不同。在一个简单的测试中,处理一个1.5兆文件中36909个新行,分割/合并操作花费了0.124秒,而上述方法仅需0.071秒。
9 字串匹配
- NSRange range = [[string name] rangeOfString: otherString options: NSCaseInsensitiveSearch];
10 今天日期的字符串
将一个日期转换成字符串的通用方法就是通过NSDateFormatter。有时你想生成一个格式比较友好的日期字符串。比如你需要"December 4, 2007",这种情况下就可以使用:
- [[NSDate date] descriptionWithCalendarFormat: @"%B %e, %Y" timeZone: nil locale: nil]
(感谢Mike Morton提供该方法)
11 除去字符串末尾的空格
- NSString *ook = @"\n \t\t hello there \t\n \n\n";
- NSString *trimmed =
- [ook stringByTrimmingCharactersInSet:
- [NSCharacterSet whitespaceAndNewlineCharacterSet]];
- NSLog(@"trimmed: '%@'", trimmed);
输出结果是:
2009-12-24 18:24:42.431 trim[6799:903] trimmed: 'hello there'
图形
1 绘制一个粗体字符串
- - (void) drawLabel: (NSString *) label
- atPoint: (NSPoint) point
- bold: (BOOL) bold {
- NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
- NSFont *currentFont = [NSFont userFontOfSize: 14.0];
- if (bold) {
- NSFontManager *fm = [NSFontManager sharedFontManager];
- NSFont *boldFont = [fm convertFont: currentFont
- toHaveTrait: NSBoldFontMask];
- [attributes setObject: boldFont
- forKey: NSFontAttributeName];
- } else {
- [attributes setObject: currentFont
- forKey: NSFontAttributeName];
- }
- [label drawAtPoint: point withAttributes: attributes];;
- }