
對比其他物件導向程式語言 (object-oriented programming language) ,例如 Java , alloc 等同 new 的作用,然而 Java 中的建構子 (constructor) 可以說是一種特殊的方法 (method) ,但不是方法, Objective-C 的 init 卻是道道地地的方法。
現在我們要來開始設計 Encrypt 類別的 init ,我們不打算改寫 NSObject 的 init ,而是另外設計專屬於 Encrypt 的 initRandomEncrypt ,這樣一來,方法名稱能夠更符合語意。程式如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #import <Foundation/Foundation.h> #import "Encrypt.h" @implementation Encrypt @synthesize cArray, oArray; - ( id ) initRandomEncrypt { // 設置 y = a * x + b 中的 a 與 b int a = 0 ; int b = 0 ; do { a = arc 4 random() % 1 0 ; b = arc 4 random() % 1 0 ; } while (a % 2 == 0 ); // 建立 oArray 及 cArray oArray = [ NSArray arrayWithObjects : @"a" , @"b" , @"c" , @"d" , @"e" , @"f" , @"g" , @"h" , @"i" , @"j" , @"k" , @"l" , @"m" , @"n" , @"o" , @"p" , @"q" , @"r" , @"s" , @"t" , @"w" , @"v" , @"u" , @"x" , @"y" , @"z" , nil ]; cArray = [ NSMutableArray arrayWithCapacity : 26 ]; // 製作密碼表 cArray int n = 2 6 ; char c = 'a'; int i, d, ci, count, m; for (i = 0 , count = c;i < n;i++) { ci = count; d = ci * a + b; m = d % n; [cArray addObject : [oArray objectAtIndex : m ]]; count++; } // 回傳 self return self ; } - ( NSString *) toEncode : ( NSString *) s {} - ( NSString *) toDecode : ( NSString *) s {} @end /* 《程式語言教學誌》的範例程式 檔名:Encrypt.m 功能:示範 Objective-C 程式 作者:張凱慶 時間:西元 2012 年 7 月 */ |
首先,開頭的負號表示實體方法 (instance method) ,小括弧中的 id 表示回傳值 (return value) 為任意型態,其後 initRandomEncrypt 為方法名稱
9 | - ( id ) initRandomEncrypt |
接下來是取得兩個隨機數 a 與 b ,這裡利用 C 語言的 arc4random() 函數 (function) 得到一個隨機的整數,這裡除以 10 ,使 a 與 b 都得到 10 以內的整數
11 12 13 14 15 16 17 | // 設置 y = a * x + b 中的 a 與 b int a = 0 ; int b = 0 ; do { a = arc 4 random() % 1 0 ; b = arc 4 random() % 1 0 ; } while (a % 2 == 0 ); |
這裡是利用 do-while 迴圈 (loop) ,因為我們希望 a 得到奇數值,如果 a 是偶數,最後有可能會得到奇怪結果。
initRandomEncrypt 的第二個部份,我們用 NSArray 的類別方法 arrayWithObjects: 與 NSMutableArray 的類別方法 arrayWithCapacity: 各自建立 oArray 與 cArray
19 20 21 22 23 24 25 | // 建立 oArray 及 cArray oArray = [ NSArray arrayWithObjects : @"a" , @"b" , @"c" , @"d" , @"e" , @"f" , @"g" , @"h" , @"i" , @"j" , @"k" , @"l" , @"m" , @"n" , @"o" , @"p" , @"q" , @"r" , @"s" , @"t" , @"w" , @"v" , @"u" , @"x" , @"y" , @"z" , nil ]; cArray = [ NSMutableArray arrayWithCapacity : 26 ]; |
雖然這樣已經建立 cArray ,但是這樣的 cArray 是空的不包含任何物件,因此第三個部份便是依公式將密碼表製作出來,最後 cArray 便會儲存我們需要的密碼表
27 28 29 30 31 32 33 34 35 36 37 | // 製作密碼表 cArray int n = 2 6 ; char c = 'a'; int i, d, ci, count, m; for (i = 0 , count = c;i < n;i++) { ci = count; d = ci * a + b; m = d % n; [cArray addObject : [oArray objectAtIndex : m ]]; count++; } |
我們利用 NSMutableArray 的 addObject: 加入物件到 cArray 之中,所加物件是依餘數 m 取得 oArray 中的 NSString 字串物件,也就是利用 NSArray 的 objectAtIndex: 方法。
好了,來寫 demo.m 測試看看吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #import <Foundation/Foundation.h> #import "Encrypt.h" int main( int argc, char *argv[]) { NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ]; Encrypt *e = [[ Encrypt alloc ] initRandomEncrypt ]; NSString *o = @"\n\n" ; int i; for (i = 0 ;i < 2 6 ;i++) { o = [o stringByAppendingString : [[e cArray ] objectAtIndex : i ]]; } [o stringByAppendingString : @"\n\n" ]; NSLog(o); [pool drain ]; return 0 ; } /* 《程式語言教學誌》的範例程式 檔名:demo.m 功能:示範 Objective-C 程式 作者:張凱慶 時間:西元 2012 年 7 月 */ |
Build and Go ,結果如下

密碼表做出來囉!繼續來設置編碼功能吧!
中英文術語對照 | |
---|---|
類別 | class |
物件 | object |
物件導向程式語言 | object-oriented programming language |
建構子 | constructor |
方法 | method |
實體方法 | instance method |
回傳值 | return value |
函數 | function |
迴圈 | loop |
您可以繼續參考
軟體開發
相關目錄
Objective-C 入門指南
Objective-C 教材
首頁
參考資料
Learning Objective-C: A Primer
The Objective-C Programming Language
Cocoa Fundamentals Guide
Coding Guidelines for Cocoa
Advanced Memory Management Programming Guide
Archives and Serializations Programming Guide
1 則留言:
此行 [o stringByAppendingString: @"\n\n"];
我猜您預期的效果應該是有換行,故應該改成
o = [o stringByAppendingString: @"\n\n"];
張貼留言