- KVC技巧
- registerDefaults:
一、KVC技巧
在KVC编程中, valueForKey: 在一些场景下很方便,比如它在对 NSArray 和 NSSet集合类的重写。在对这些集合类使用 valueForKey: 时并不是对它们进行操作,而是对集合里的每个对象进行操作,然后把处理结果添加到返回数据的集合里。因此,我们可以很简单的从其他集合类构建出我们需要的集合类,比如下面这个例子:
NSArray *array = @[@"hello",@"Objective-C",@"swift"]; NSArray *uppercaseArray = [array valueForKey:@"uppercaseString"]; NSLog(@"返回结果:%@", uppercaseArray); ... 返回结果:( HELLO, "OBJECTIVE-C", SWIFT )
上述代码中我们由一个字符串数组得到了字符串全部大写之后的新数组。 valueForKey: 将uppercaseString 方法传给了NSArray的所有子元素,并且将处理结果添加到了返回的NSArray中。当然,多个消息也可以用key paths来处理,比如:
NSArray *array = @[@"hello",@"Objective-C",@"swift"]; NSArray *lengthArray = [array valueForKeyPath:@"uppercaseString.length"]; NSLog(@"返回结果:%@", lengthArray); ... 返回结果:( 5, 11, 5 )
上面的代码会先对array中的每个元素调用uppercaseString方法,然后再调用 length方法,最后封装成NSNumber对象并添加到lengthArray中返回。
KVC还能实现一些复杂的功能,比如计算numbers数组的和或者平均值。比如:
NSArray *array = @[@"hello",@" ",@"swift",@"!"]; int totalLength = [[array valueForKeyPath:@"@sum.length"] intValue]; int avgLength = [[array valueForKeyPath:@"@avg.length"] intValue]; NSLog(@"总长度是:%d",totalLength); NSLog(@"平均长度是:%d",avgLength); ... 总长度是:12 平均长度是:4
@sum是对 length属性的返回值取总和的操作符,@avg是取平均值的操作符。它们与下面的方法功能相同,但性能上更高效:
NSArray *array = @[@"hello",@" ",@"swift",@"!"]; int totalLength = 0; for (NSString *string in array) { totalLength += [string length]; }
如果大家还想了解KVC中使用上述@操作符的一些内容,可以查看 这篇文章 ,相信你会喜欢的。
熟练运用上面所说的KVC技巧,不仅可以精简代码,也会让我们在某些需求下编码更加方便。
二、registerDefaults:
NSUserDefaults是我们在保存和读取用户偏好信息时经常用到的一个类,它用起来很方便也很简单。但在开发时我们通常要设定一些默认的偏好信息,比如首次启动App要显示Tutorial,App是否第一次启动以及一些默认字符串什么的。这个时候我们可以用 registerDefaults: 方法来统一管理并加载这些默认信息。
首先我们可以新建一个DefaultPreferences.plist(名字随便)文件并添加到我们的target中,然后在DefaultPreferences.plist添加应用相关的默认信息,接着你需要在读取这些信息前调用下面的代码:
NSURL *defaultPrefsFile = [[NSBundle mainBundle] URLForResource:@"DefaultPreferences" withExtension:@"plist"]; NSDictionary *defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];
然后我们在读取的时候就可以得到我们想要的默认值了。并且,我们可以在plist文件里统一管理并修改这些信息,不用在代码里找来找去了。
Note:需要注意的是,registerDefaults: 不会将这些默认值持久保存到disk中,你需要在每次程序启动的时候都调用上面的代码,不然会读取到错误的默认值。但是如果你调用过 setBool:forKey: (或者其他set方法)方法修改了某个默认值,那么读取时会以你set的值为准。建议你将上面的代码放在 application:didFinishLaunchingWithOptions: 中
三、UILabel的自适应字体大小
当UILabel的宽度为一行且固定时,为了显示出全部内容,需要让Label自适应Font大小,此时可用UILabel的自带属性解决问题。
//默认为NO,设为YES时自动适配字体大小 _tipsLabel.adjustsFontSizeToFitWidth = YES; //设置字体调整时为居中适配 _tipsLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
四、用NSExpression计算数学结果
介绍一个不常用但是也很有用的技巧,用NSExpression来计算数学表达式,代码如下所示:
NSString *text = @"5 + (5 * 4) / 2"; NSExpression *e = [NSExpression expressionWithFormat:text, nil]; NSNumber *result = [e expressionValueWithObject:nil context:nil]; NSLog(@"result: %@", result);
打印结果为15,正好符合了我们所写的数学表达式的计算结果。
五、获取逆序的Array数组
获取逆序Array数组的代码如下:
NSArray *numbers = @[@"1",@"2",@"3"]; NSArray *reversed = numbers.reverseObjectEnumerator.allObjects; NSLog(@"reversed:%@",reversed);
小编通过近段时间的各种面试和业内交流,特地整理了一个面试题整合文档,里面包含了几个比较知名大厂的面试题和答案,需要的话可以关注小编,私信“01”即可免费获取的