1.過程式編程實例,畫出Shape數組中的圖形:編程
// // main.m // hello-obj // // Created by zhouyang on 16/4/4. // Copyright © 2016年 zhouyang. All rights reserved. // #import <Foundation/Foundation.h> //枚舉變量,表明形狀 typedef enum{ kCircle, kRectangle, kEgg } ShapeType; //枚舉變量,表明顏色 typedef enum{ kRedColor, kGreenColor, kBlueColor } ShapeColor; //結構體,表明形狀 typedef struct{ int x,y,width,height; }ShapeRect; //結構體,表示多邊形的各項屬性 typedef struct { ShapeType type; ShapeColor fillColor; ShapeRect bounds; }Shape; //返回顏色對應的NSString NSString *colorName(ShapeColor colorName){ switch(colorName){ case kRedColor: return @"red"; break; case kGreenColor: return @"green"; break; case kBlueColor: return @"blue"; break; } return @"no clue"; } //「畫出」圓,其實就是輸出圖形的各項屬性 void drawCircle(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a circle at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //「畫出」長方形 void drawRectangle(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a rectangle at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //"畫出"Egg void drawEgg(ShapeRect bounds,ShapeColor fillColor){ NSLog(@"drawing a egg at (%d,%d,%d,%d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor) ); } //遍歷Shape數組,畫出對應的圖形 void drawShapes(Shape shapes[],int count){ for(int i=0;i<count;i++){ switch (shapes[i].type) { case kCircle: drawCircle(shapes[i].bounds, shapes[i].fillColor); break; case kRectangle: drawRectangle(shapes[i].bounds,shapes[i].fillColor); break; case kEgg: drawEgg(shapes[i].bounds,shapes[i].fillColor); break; default: NSLog(@"can't find the shape!"); } } } int main(int argc, const char * argv[]) { Shape shapes[3]; //Circle ShapeRect rect0={0,0,10,30}; shapes[0].type=kCircle; shapes[0].fillColor=kRedColor; shapes[0].bounds=rect0; //Rectangle ShapeRect rect1={30,40,50,60}; shapes[1].type=kRectangle; shapes[1].fillColor=kGreenColor; shapes[1].bounds=rect1; //Egg ShapeRect rect2={15,18,37,29}; shapes[2].type=kEgg; shapes[2].fillColor=kBlueColor; shapes[2].bounds=rect2; //畫出數組Shape中的圖形 drawShapes(shapes,3); }
基於OOP編程,能夠將上述代碼改寫爲如下格式:數組
#import <Foundation/Foundation.h> //注意枚舉變量的定義,變量之間以逗號隔開 typedef enum{ kRedColor, kGreenColor, kBlueColor }ShapeColor; typedef struct { int x,y,width,height; }ShapeRect; NSString *ColorName(ShapeColor color){ switch (color) { case kRedColor: return @"red"; break; case kGreenColor: return @"green"; break; case kBlueColor: return @"blue"; break; } return @"no clue"; } //定義接口 //@告訴編譯器,這裏是對C的擴展 @interface Circle:NSObject{ //定義數據成員 @private ShapeColor fillColor; ShapeRect bounds; } //列舉方法的名稱,返回值的類型和某些參數 //前面的短線代表這是Objective-c方法的聲明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Circle //接口定義完畢 //下面開始實現接口Circle @implementation Circle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//設置顏色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Circle //定義接口 //@告訴編譯器,這裏是對C的擴展 @interface Rectangle:NSObject{ //定義數據成員 @private ShapeColor fillColor; ShapeRect bounds; } //列舉方法的名稱,返回值的類型和某些參數 //前面的短線代表這是Objective-c方法的聲明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Rectangle //接口定義完畢 //下面開始實現接口Rectangle @implementation Rectangle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//設置顏色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a rectangle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Egg //定義接口 //@告訴編譯器,這裏是對C的擴展 @interface Egg:NSObject{ //定義數據成員 @private ShapeColor fillColor; ShapeRect bounds; } //列舉方法的名稱,返回值的類型和某些參數 //前面的短線代表這是Objective-c方法的聲明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Triangle //接口定義完畢 //下面開始實現接口Triangle @implementation Egg - (void) setFillColor:(ShapeColor) c { fillColor=c; }//設置顏色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a egg at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Egg //定義接口 //@告訴編譯器,這裏是對C的擴展 @interface Triangle:NSObject{ //定義數據成員 @private ShapeColor fillColor; ShapeRect bounds; } //列舉方法的名稱,返回值的類型和某些參數 //前面的短線代表這是Objective-c方法的聲明 - (void) setFillColor:(ShapeColor) fillColor; - (void) setBounds:(ShapeRect) bounds; - (void) draw; @end //@Triangle //接口定義完畢 //下面開始實現接口Triangle @implementation Triangle - (void) setFillColor:(ShapeColor) c { fillColor=c; }//設置顏色 - (void) setBounds:(ShapeRect) b{ bounds=b; } - (void) draw{ NSLog(@"drawing a triangle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, ColorName(fillColor) ); } @end //Triangle //畫出圖形 //id 對應類實例 void drawShapes(id shapes[],int count){ for(int i=0;i<count;i++){ id shape=shapes[i]; [shape draw]; } } int main(int argc, const char * argv[]) { id shapes[4]; //Circle shapes[0]=[Circle new];//這裏建立新的類實例將new加在類名稱的後面 ShapeRect rect0={0,0,10,30}; [shapes[0] setBounds:rect0]; [shapes[0] setFillColor:kRedColor]; //Rectangle ShapeRect rect1={30,40,50,60}; shapes[1] =[ Rectangle new]; [shapes[1] setBounds:rect1]; [shapes[1] setFillColor:kGreenColor]; //Egg ShapeRect rect2={15,18,37,29}; shapes[2] =[Egg new]; [shapes[2] setBounds:rect2]; [shapes[2] setFillColor:kBlueColor]; //Triangle ShapeRect rect3 ={47,32,80,50}; shapes[3] =[Triangle new]; [shapes[3] setBounds:rect3]; [shapes[3] setFillColor:kGreenColor]; //畫出數組Shape中的圖形 drawShapes(shapes,4); return 0; }
可見利用OOP編程方式,增長新的圖形更加簡單,修改的地方更少。
spa
請注意object-c中的接口,類的定義以及類方法的調用,這裏與C++仍是存在不少的不一樣。code
可能會遇到錯誤:Must explicitly describe intended ownership of an object array parameter,解決方法以下:blog
將Objective-c Automatic Reference Counting 設置爲No,關閉ARC便可。接口