APPKit(APPlicationKit)简介

颛孙子民
2023-12-01

1 . IBOutlet和IBAction关键字

IBOutlet:的定义没有任何作用,因此将不会对他进行编译。

IBAction:定义为void,即以IBAction声明的方法的返回类型是void(也就是什么都不返回)。

IBOutlet和IBAction实际上是为Interface Builder(IB)以及阅读代码的人提供的标记。通过查找这两个关键字,Interface Builder知道某个对象具有两个能够连接的实例变量。


2 . NSDate

    +dateWithTimeIntervalSinceNow:       方法接受一个NStimeInterval参数,该参数是一个双精度值,表示以秒为单位的时间间隔。通过该参数可以指定时间偏移的方式:对于将来的时间,使用正的时间间隔;对于过去的时间,使用负的时间间隔。


3 . KVC

KVC即为键/值编码。在键/值编码中的基本调用包括 -valueForKey: 和 -setValue:forKey:。以字符串的形式向对象发送消息,这个字符串是我们关注的属性的关键。

当使用valueForKey: 时,它自动将标量值(int、float、struct)放入NSNumber和NSValue中。

如果在调用 -setValue:forKey: 之前设置一个标量值,你需要将它包装起来(把它大包)。例如:[car setValue : [NSNumber numberWithFloat:2] forKey : @"mileage"];

为什么不用KVC来处理所有对象?因为KVC需要解析字符串来计算你所需要的答案,因此速度比较慢。编译器还无法对它进行错误检查。


4 . 注意<null>和(null)之间的区别

<null>是一种[NSNull null] 对象,而(null)是一个真是存在的nil值。


5 . NSPredicate

NSPredicate 用于指定过滤器的条件。可以创建NSPredicate对象,通过该对象准确的描述所需的条件,对每个对象通过谓词进行筛选,判断他们是否与条件相匹配。

1 . 创建谓词:

Car *car = makeCar(@"Heibie", @"Honder", @"CRX", 1984, 2, 110000, 58); // 汽车信息:品牌为Herbie,型号为双门1984HondaCRX,马里引擎为58,行驶距离110000
NSPredicate *predicate = [NSPredicate predicateWithFormat : @"name == 'Herbie'"]; // 通过这步我们就可以得到一个谓词
BOOL match = [predicate evaluateWithObject : car]; // 通知接收对象(谓词)根据指定的对象计算自身的值 
NSLog(@"%s", (match) ? "YES", "NO");

           假设我们 需要查看车库中哪些汽车的功率最大,可以循环测试每个汽车的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat : @"engine.horsepower > 150"];
for (Car *car in array) {
<span style="white-space:pre">	</span>if ([predicate evaluateWithObject : car]) {
		NSLog(@"%@", car.name); } } // 输出马力大于150的汽车名字


2 . 燃料过滤器

-filterArrayUsingPredicate: // 该方法是数组中的一种类别方法,它将循环过滤数组内容,根据谓词计算每个对象的值,并将值为YES的对象积累到将被返回的数组中。

NSArray *result = [cars filterArrayUsingPredicate : predicate];

- filterUsingPredicate : // 该方法是NSMutableArray所拥有的。通过该方法可以剔除不属于该数组的所有项目

3 . 格式说明符

通过NSPredicate字符串,也可以使用%k指定键路径。例如:

predicate = [NSPredicate predicateWithFormat:@"%k == %@", @"name", @"Herbie"];

为了构造灵活的谓词,还可以将变量名放入字符串中,类似于环境变量。除了使用NSString外,还可以使用NSNumber,也可以使用[NSNull null]设置nil值,还可以使用数组。不过不能使用$VARIABLE作为键路径,因为它只表示值。使用谓词格式字符串时,如果想通过程序改变键路径,要使用%k格式说明符。

例如:

NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name" == @"$NAME"];
NSDictionary *varDict = [NSDictionary dictionaryWithObjectsAndKeys : @"Herbie", @"NAME", nil]; // 其中键是变量名(不包含$)词是插入谓词的内容,用字符串Heibie作为键“NAME”的值
predicate = [predicateTemplate predicateWithSubstitutionVariables : varDict];

4 . 比较和逻辑运算符

谓词字符串语法支持C语言中一些常用的运算符,例如 == ,=,<,>,还支持括号表达式和AND、OR、NOT逻辑运算符或者C样式的等效表达式&&、||、!。而且运算符不区分大小写,可以随意使用and、And、anD等。

5 . 数组运算符

predicate = [NSPredicate predicateWithFormat:@"engine.horsePower BETWEEN {50, 200}"]; // 或括号表示数组,BETWEEN将数组中第一个元素看成是数组的下届,第二个是上届。

可是用%@格式说明符插入NSArray对象

NSArray *array = [NSArray arrayWithObjects:[NSNumber numberWithInt:50], [NSNumber numberWithInt:200], nil];
predicate = [NSPredicate predicateWithFormat:@"engine.horsePower BETWEEN %@", array];

也可以使用变量,类似与上面3中的例子,将字符串@“Herbie”改成数组。

数组并不仅仅用来指定某个区间的端点值。可以使用IN运算符查找数组中是否含有某个特定值。

predicate = [NSPredicate predicateWithFormat:@"name IN {'Heibie', 'Snugs', 'Badger'}"];
results = [cars filterArrayUsingPredicate:predicate];

6 . 字符串运算符

BEGINSWITH : 检查某个字符串是否以另一个字符串开头

ENDSWITH : 检查某个字符串是否以另一个字符串结尾

CONTAINS :  检查某个字符串是否是在另一个字符串内部

以上这些匹配都是区分大小写的。为了减少名称匹配规则,可以为这些运算符添加[ c ]、[ d ]、 [ cd ]。其中c表示:不区分大小写;d表示:不区分发音符号(即没有重音符);cd表示:既不区分大小写、又不区分发音符号。

LIKE:问号表示与一个字符匹配;星号表示与任意个字符比较。

例如:"name LIKE '*er*' " :与任何含有“er”的名称相匹配,这等效于CONTAINS

   "name LIKE '???er*' ":与字符串“Paper Car”相匹配,因为其中的“er”前面有三个字符,“er”后面有一些字符。

      虽然正则表达式的功能强大,但他们的计算开销非常大。如果在谓词中有某些简单的运算符,例如基本字符串运算符和比较运算符,那么在使用MATCHES之前可以先执行简单的运算,这样将会提高程序的运算速度。



 类似资料: