Share
Embed
Transcript
91 slides
-
Objective-C http://MobileDev.TW 大綱 1. Hello Objective-C! Xcode環境認識 2. Objective-C語法類別、物件與方法
1) 從一個簡單的分數開始 2) 來寫一個計算機 3) 再論類別 3. 繼承的概念 4. Category&Protocol 5. Framework 6. 資料型態 id 7. 星號與初始化 2 -
Objective-C http://MobileDev.TW 步驟1/4 1. 打開Xcode -> Create a new
Xcode project 4 -
Objective-C http://MobileDev.TW You should got it NOW • Xcode可以製作哪些種類的應用程式
• 如何查閱進一步解釋 • 如何跳至匯入程式碼的原始位置 • 如何使用NSLog顯示變數的值 16 -
Objective-C http://MobileDev.TW 建立類別 • 建立一個運算分數的類別 • 裡面有分子、分母 • 有輸入分子的方法
• 有輸入分母的方法 • 有輸出結果的方法 22 類別就像是生產工廠的運 作機制,建立了類別,就 可以根據這個類別,創造 出一個個的物件來使用。 -
Objective-C http://MobileDev.TW Objective-C 術語小字典:iVar • 實體變數(instance variable) • 簡稱
iVar • 相當於一個類別中的屬性定義 25 就像是一個工廠的儲 存空間。 在設計類別時,需要 思考有哪些東西需要 一個儲存空間,這些 東西會被各個運作部 門所使用。 -
Objective-C http://MobileDev.TW 2-2.來寫一個計算機! • 建立一個計算機類別,裡面放一個iVar來儲存結果 • 跟結果相關的方法 • 設定結果
• 清除結果 • 取出結果 • 計算用的方法 • 加法 • 減法 • 乘法 • 除法 35 -
Objective-C http://MobileDev.TW 用檔案來區分用途 • 全部寫在一起難以 管理 • 將每一組interface 與implentation分
開儲存: • .h檔:類別宣告 • .m檔:類別方法實作 41 @inerface A:NSObject …. @end @implentation A …. @end @inerface B:NSObject …. @end @implentation B …. @end @inerface C:NSObject …. @end @implentation C …. @end A.h A.m B.h B.m C.h C.m -
Objective-C http://MobileDev.TW 2-3-1-2.再論類別與物件 • 設計類別作為模板,用類別來創造實體物件 • 在.h檔中設計類別,放置於@interface與@end中 • 實體變數(instance
variables) • 相當於一個類別中的屬性定義 • 方法 • 該類別可以操作的功能 49 -
Objective-C http://MobileDev.TW 2-3-2.自動產生Setter與Getter • 在Fraction.h中加入 51 • 在Fraction.m中加入 •
加了這兩句,就會自動產生了 • Getter:numerator,denominator • Setter:setNumerator,setDenominator -
Objective-C http://MobileDev.TW 2-3-2-1.自動產生Synthesize • 開發環境版本:Xcode4.5+iOS6之後 • 建立@property後,自動產生@synthesize • 自動建立成
@synthesize ivarName=_ivarName; • 在類別中,直接透過 _ivarName或self.ivarName 直接存取 • 在其他運作流程中,用objName.ivarName來存取 53 -
Objective-C http://MobileDev.TW Dot Operator:可存可取 [myFraction numerator] is equal to
myFraction.numerator 55 [myFraction setNumerator : 1] is equal to myFraction.numerator=1 -
Objective-C http://MobileDev.TW 點運算子與[ ]混用 [[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];
--> [myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0]; [myAppObject setTheArray:aNewArray]; --> myAppObject.theArray = aNewArray; 56 -
Objective-C http://MobileDev.TW 方法的語法 -(void) setMake:(NSString *) aMake andModel:(NSString *)
aModel andYear:(int) aYear; 此方法的名稱為:setMake:andModel:andYear: 用C的方法寫長這樣: setMake:andModel:andYear(NSString* aMake,NSString *aModel, int aYear); 缺點:語法複雜 優點:可以看得出來每個變數的用途 方法名稱在Objective-C又稱為選擇器(selector) 60 -
Objective-C http://MobileDev.TW You should got it NOW • 類別、物件與方法,想想工廠的運作
• 什麼是iVar? iVar的存取方式的進化 • 自己寫同名方法 • 自動產生 • 自動產生Synthesize • 點運算子怎麼用 • 接收多個變數的方法怎麼寫、怎麼用? • self關鍵字是什麼,什麼時機會用到? 63 -
Objective-C http://MobileDev.TW 3-1.運用繼承再客製化類別 • 設計一個正方形類別 1. 若原先已經有矩形類別,那就繼承它,創一個正方形類別 2. 再增加正方形需要用的屬性與方法
3. 正方形這個類別,可以使用矩形類別中的屬性與方法 65 矩形類別 iVar Ra; iVar Rb; Method R1; Method R2; 正方形類別 : 矩形類別 iVar Ra; iVar Rb; Method R1; Method R2; iVar Sa; iVar Sb; Method S1; Method S2; -
Objective-C http://MobileDev.TW 3-2.繼承的運作 • 父類別的所有實體變數與方法,都會成為子類別定 義的一部份。 • 子類別可以直接存取這些方法與實體變數。 •
首先會先確認該變數或方法是否存在目前物件的類 別定義中,若沒有,則會往父類別去尋找。 66 -
Objective-C http://MobileDev.TW 4-2-2.採納協定 • 要實作的類別,則稱為遵從(conform)或採納(adopt )該協定 • 在@interface後面加上<協定> •
在@interface中不用再宣告協定中的方法,但在實 作區段中必須定義他們 75 -
Objective-C http://MobileDev.TW You should got it NOW • Category的使用時機
• Protocol如何定義 • Protocol如何遵循 76 -
Objective-C http://MobileDev.TW 5-1.什麼是Framework • Framework • 泛指能夠簡化開發程序的一堆類別、方法、函數與文 件的集合。 •
Foundation Framework • 提供一切基礎所需的framework,如數字、字串處理 、陣列、dictionary、日期時間、檔案系統等等。 • Application Kit Framework • 用來開發互動的圖形化應用程式 • 提供文字、選單、工具列、表格等等。 78 -
Objective-C http://MobileDev.TW 5-2.Cocoa 與 Cocoa Touch • Cocoa •
Foundation Framework • Application Kit Framework • Core Data • Cocoa Touch • Foundation Framework • UIKit Framework • Game Kit Framework • iAD Framework • Map Kit Framework 79 -
Objective-C http://MobileDev.TW id這麼好用,為什麼不全部宣告為id? • 宣告為特定資料形態者,稱之為靜態型別 • int x=5; •
靜態型別在編譯期間,即會檢查被呼叫的方法,若 無該方法,此時就會提出警告 • 及早防範程式錯誤 • 增加程式的可讀性 82 -
Objective-C http://MobileDev.TW Q1.什麼時候要用*號? • Objective-C所有的物件都是透過指標的方式來找 到該位址,並進行存取。 • 而沒有使用指標的通常是C語言的原始型別(Primitive type)
• 字元 char • 整數 int、short、long • 浮點數 float、double • 布林值 BOOL 84 -
Objective-C http://MobileDev.TW 在Objectiv-C中可以使用C的基本型別 直接拿來用 85 int someInteger = 42;
float someFloatingPointNumber = 3.1415; double someDoublePrecisionFloatingPointNumber = 6.02214199e23; int someInteger = 42; someInteger++; // someInteger == 43 someInteger--; // someInteger == 42 someInteger *= 2; // someInteger == 84 所以也可以用C語言的operator -
Objective-C http://MobileDev.TW 用C語言的struct來持有基本型別的值 用NSRange結構來持有一個字串的位置與長度 87 NSString *mainString = @"This
is a long string"; NSRange substringRange = [mainString rangeOfString:@"long"]; typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; 位置:10 長度:4 -
Objective-C http://MobileDev.TW 物件也可以用來呈現基本型別的數值 用NSString物件來存放字串 88 NSString *firstString = [[NSString
alloc] initWithCString:"Hello World!" encoding:NSUTF8StringEncoding]; NSString *secondString = [NSString stringWithCString:"Hello World!" encoding:NSUTF8StringEncoding]; NSString *thirdString = @"Hello World!"; -
Objective-C http://MobileDev.TW 用NSNumber物件來持有各種基本型別的數值 char,double,float,int,long,short,….都可持有 89 NSNumber *magicNumber = [[NSNumber
alloc] initWithInt:42]; NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u]; NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l]; NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES]; NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f]; NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535]; NSNumber *someChar = [NSNumber numberWithChar:'T']; 也可從物件中取出基本型別的值餵給C語言的型別 int scalarMagic = [magicNumber intValue]; unsigned int scalarUnsigned = [unsignedNumber unsignedIntValue]; long scalarLong = [longNumber longValue]; BOOL scalarBool = [boolNumber boolValue]; float scalarSimpleFloat = [simpleFloat floatValue]; double scalarBetterDouble = [betterDouble doubleValue]; char scalarChar = [someChar charValue]; -
Objective-C http://MobileDev.TW 用NSNumber物件來持有各種基本型別的數值 90 當然也可從物件中取出基本型別的值, 餵給Objective-C語言的基本型別 NSInteger anInteger =
64; NSUInteger anUnsignedInteger = 100; NSNumber *firstInteger = [[NSNumber alloc] initWithInteger:anInteger]; NSNumber *secondInteger = [NSNumber numberWithUnsignedInteger:anUnsignedInteger]; NSInteger integerCheck = [firstInteger integerValue]; NSUInteger unsignedCheck = [secondInteger unsignedIntegerValue];