NSValue NSValue

我们把 Objective-C 的集合类型(数组、字典、集合)都已经过了一遍,并且已经知道了它们都只能存储对象。也就是说,如果你要在一个数组里存放整数的话,你只能用 NSNumber 实例,但如果是CGRect , CGSize, CGPoint 呢?

他们也不能存放在数组里,因为他们是结构体而非对象,那怎么办嘞?苹果的解决方法是?创建一个泛型对象,在这个对象里你可以放各种各样的数据类型,这个泛型对象就叫做 NSValue。不管在 OS X 和 iOS 系统上面,都有这个数据类型。里

在 Hacking with Swift 这本书的第16个项目里就有这段代码。这段代码的目的是在键盘弹出时,改变界面的大小。

let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey]
as! NSValue).CGRectValue()

在这个方法里,我们用了一个叫做 userInfo 的字典,而这个类型里存储了一个 NSValue 数据,这个数据里存储的是 CGRect,CGRect 这才是真正设定键盘大小的值。

NSValue 类里存各种各样的值,具体是什么数据类型,取决于你的项目。我们可以看下面的这些代码,在 OS X 系统上是这样的:

NSValue *rect = [NSValue valueWithRect:NSMakeRect(0, 0, 10, 10)];
NSValue *point = [NSValue valueWithPoint:NSMakePoint(0, 0)];
NSValue *size = [NSValue valueWithSize:NSMakeSize(10, 10)];

但是在ios系统上,要写成这样:

NSValue *rect = [NSValue valueWithCGRect:CGRectMake(0, 0, 10, 10)];
NSValue *point = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
NSValue *size = [NSValue valueWithCGSize:CGSizeMake(10, 10)];
NSValue *transform = [NSValue
valueWithCGAffineTransform:CGAffineTransformIdentity];
NSValue *insets = [NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(10,
10, 10, 10)];

NSValue 就是这样,它是一个泛型类。当你真的开始写 Objective-C 代码时,你会发现你要经常和它打交道。

results matching ""

    No results matching ""