void drawShapes(Shape shapes[],int count){ int i; for(i=0;i< count;i++){ id shape=shapes[i]; [shape draw]; } }
1.shapes为一个类型是Shape的结构体数组。
id shape=shapes[i];
id 为一个指向其中某个结构的指针。
[shape draw];
表示对对象shape做draw操作(向shape发送消息draw)。
2.
@interface Circle:NSObject{ ShapeColor fillColor; ShapeRect bounds; } -(void) setFillColor:(ShapeColor) fillColor; //[circle setFillColor: fillColor] -(void) setBounds: (ShapeRect) bounds; //[circle setBounes:bounds] -(void) draw; //[circle draw] @end
这里定义了一个名为Circle并继承自NSObject的接口,其中包含了两个属性,分别死color和bounds;三个方法声明。方法声明和函数原形的区别在于是否有先行短线"-" 。
-(void) setFillColor:(ShapeColor) fillColor;
方法声明的结构为:
- (返回类型)方法名[:(参数类型) 参数1值名 参数2名:(参数类型) 参数2值名 ...]
方法调用(中缀符的使用):
[circle setFillColor: fillColor]
意思同:
circle.setFillColor(fillColor);
如果是多个参数:
[textThing setStringValue: @"hello there" color: kBlueColor];
@"hello there"和 kBlueColor都为传入的参数 (?setStringValue和color是参数名还是方法名的一部分?)
3.Circle的实现
@implementation Circle -(void) setFillColor:(ShapeColor) c{ //fillColor=c; self->fillColor=c; }//set color -(void) setBounds:(ShapeRect) b{ bounds=b; }//set bounds -(void) draw{ NSLog(@"draw a circle at (%d,%d,%d,%d) in %@ ",bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor)); } @end
和声明差别不大,对原先的方法做了具体的实现。
self->fillColor=c;
self是一个隐藏传送的参数,代表消息接收对象本身。
4.Circle的实例化
[Circle new]
objective-c中可以把类当成对象一样来发送消息。