
對比其他物件導向程式語言 (object-oriented programming language) ,例如 Java , alloc 等同 new 的作用,然而 Java 中的建構子 (constructor) 可以說是一種特殊的方法 (method) ,但不是方法, Objective-C 的 init 卻是道道地地的方法。
現在我們要來開始設計 Encrypt 類別的 init ,我們不打算改寫 NSObject 的 init ,而是另外設計專屬於 Encrypt 的 initRandomEncrypt ,這樣一來,方法名稱能夠更符合語意。程式如下
#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 = arc4random() % 10;
b = arc4random() % 10;
} 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 = 26;
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
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:Encrypt.m
功能:示範 Objective-C 程式
作者:張凱慶
時間:西元 2012 年 7 月 */首先,開頭的負號表示實體方法 (instance method) ,小括弧中的 id 表示回傳值 (return value) 為任意型態,其後 initRandomEncrypt 為方法名稱
- (id) initRandomEncrypt
接下來是取得兩個隨機數 a 與 b ,這裡利用 C 語言的 arc4random() 函數 (function) 得到一個隨機的整數,這裡除以 10 ,使 a 與 b 都得到 10 以內的整數
// 設置 y = a * x + b 中的 a 與 b
int a = 0;
int b = 0;
do {
a = arc4random() % 10;
b = arc4random() % 10;
} while (a % 2 == 0);這裡是利用 do-while 迴圈 (loop) ,因為我們希望 a 得到奇數值,如果 a 是偶數,最後有可能會得到奇怪結果。
initRandomEncrypt 的第二個部份,我們用 NSArray 的類別方法 arrayWithObjects: 與 NSMutableArray 的類別方法 arrayWithCapacity: 各自建立 oArray 與 cArray
// 建立 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 便會儲存我們需要的密碼表
// 製作密碼表 cArray
int n = 26;
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 測試看看吧!
#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 < 26;i++) {
o = [o stringByAppendingString: [[e cArray] objectAtIndex: i]];
}
[o stringByAppendingString: @"\n\n"];
NSLog(o);
[pool drain];
return 0;
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名: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"];
張貼留言