本章主要講解類型和協議
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