本章主要讲解类型和协议
1. 类型:Categories.如果一个类想增加方法。可以通过Categories去增加方法。
注意:Categroies声明和定义可以放在一个文件中。但是通常的做饭是把它放进两个文件,一个头文件,一个.m文件。只是命名有区别。通常使用“类名+类型名.h/m”。
类型名首字母也大写。
例子:
//
// Fraction+Comparison.h
// Fraction
//
// Created by zhengna on 15/6/30.
// Copyright (c) 2015年 zhengna. All rights reserved.
//
#import "Fraction.h"
@interface Fraction (Comparison)
- (BOOL) isEqualTo: (Fraction *)f;
- (int) compare: (Fraction *)f;
@end
//
// Fraction+Comparison.m
// Fraction
//
// Created by zhengna on 15/6/30.
// Copyright (c) 2015年 zhengna. All rights reserved.
//
#import "Fraction+Comparison.h"
@implementation Fraction (Comparison)
- (BOOL) isEqualTo: (Fraction *)f{
[self reduce];
[f reduce];
if (self.numerator == f.numerator && self.denominator == f.denominator){
return YES;
}else{
return NO;
}
}
- (int) compare:(Fraction *)f{
[self reduce];
[f reduce];
float result = [self convertToNum] - [f convertToNum];
if (result < 0) {
return -1;
}else if(result == 0){
return 0;
}else{
return 1;
}
}
@end
2. 类扩展。
其实它就是一种匿名的类型。
跟普通类型的区别:
1)没有类型名
2)可以扩展主类的实例变量和方法,在普通类型里不可以。
3)只能维护在主类的定义文件中,不可以在别的文件里。
重要作用:类扩展中定义的实例变量和方法都是私有的。只能在类内部使用。
例子:
#import "Fraction.h"
// Make the reduce method private
@interface Fraction ()
-(void) reduce;
@end
// Define the methods for the Fraction class
@implementation Fraction
@synthesize numerator, denominator;
-(void) setNumerator: (int) n and Denominator: (int) d
{
...
]
...
@end
3. 协议。
协议是一组方法的集合用来在不同类之间共享。
它不提供定义只提供方法定义。这些方法的实施交由别的类或者你去实现。
@protocol NSCopying
- (id)copyWithZone: (NSZone *)zone;
@end
@interface AddressBook: NSObject <NSCopying>
协议的目的之一是标准化一些操作。
一个协议也可以加入另一个协议。
@protocol Drawing3D <Drawing>
也可以在.m文件中导入协议。
4. 代理Delegate
它是一中协议,可以把它理解为两个类之间的一个接口。
理解为一个类定义的协议需要代理给实现这个协议的类去实现。
举例说明:比如你想显示一个UITableView去显示一个Table, 但是UITableView不知道表格的标题, 有多少section, 一个section有多少row。 或者放在每列里的内容是什么(Cell)。 所以,它代理这个责任给你通过定义一个协议叫UITableViewDataSource. 当UITableView需要每个section里有多少row的信息,它就会调用代理方法numberOfRowInSection。这个方法是需要你事先实现的。因为UITableView不知道应该放多少行,只能代理给你去实现。
5. informal protocol
非正式协议。
可以用来实现一个系统已经定义的协议在主实现文件中,并且不需要实现这个协议里的所有内容。
比如:这里实现了一个informal protocal 'NSComparisonMethods'
#import "Fraction.h"
@interface Fraction (NSComparisonMethods) //informal protcol
- (BOOL)isEqualTo:(id)object;
- (BOOL)isLessThan:(id)object;
- (BOOL)isLessThanOrEqualTo:(id)object;
- (BOOL)isGreaterThanOrEqualTo:(id)object;
- (BOOL)isGreaterThan:(id)object;
- (BOOL)isNotEqualTo:(id)object;
@end
@implementation Fraction
@synthesize numerator, denominator;
// implement the informal protcol
- (BOOL)isEqualTo:(id)object{
Fraction *arg = object;
[self reduce];
[arg reduce];
if (self.numerator == arg.numerator && self.denominator == arg.denominator) {
return YES;
}else{
return NO;
}
}
6. 复合Composite
@interface Square: NSObject
{
Rectangle *rect;
}
-(int) setSide: (int) s;
-(int) side;
-(int) area;
-(int) perimeter;
@end