Objective-Cの学習2(クラスのアクセサメソッド)
最近、気になっていること
システムインテグレーターは提供するのは労働力なのか技術なのかはたまた従順な姿勢なのかどうなんだろうか…
クラス定義
Objective-Cはc言語などと同様にヘッダーファイルにプロパティの定義などを行い、実装でメソッドなどを定義するようです。
ヘッダー(student.h)
// // student.h // sample2 // // #import <Foundation/Foundation.h> @interface student : NSObject // プロパティ定義 { int number; int class; NSString *name; int age; } // アクセサメソッド定義 - (void)setNumber:(int)number; - (int)number; - (void)setClass:(int)class; - (int)class; - (void)setName:(NSString *)name; - (NSString *)name; - (void)setAge:(int)age; - (int)age; @end
実装部分(student.m)
// // student.m // sample2 // #import "student.h" @implementation student - (void)setNumber:(int)_number { number = _number; } - (int)number { return number; } - (void)setClass:(int)_class { class = _class; } - (int)class { return class; } - (void)setName:(NSString *)_name { name = _name; } - (NSString *)name { return name; } - (void)setAge:(int)_age { age = _age; } - (int)age { return age; } @end
※拡張子がmなのはなんでなんだろう?
メインプログラムに組み込む(main.m)
// // main.m // sample2 // // #import <Foundation/Foundation.h> #import "student.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); // 初期化 student *student1 = [[student alloc] init]; student *student2 = [[student alloc] init]; // メソッドアクセス方法1 [インスタンス名 メソッド名] [student1 setNumber: 1]; [student1 setClass: 1]; [student1 setName: @"テスト 一郎"]; [student1 setAge:15]; // 出力 NSLog(@"number=%d, class=%d, name=%@, age=%d", [student1 number], [student1 class], [student1 name], [student1 age]); // メソッドアクセス方法2 インスタンス名.プロパティ student2.number = 2; student2.class = 3; student2.name = @"テスト 二郎"; student2.age = 20; // 出力 NSLog(@"number=%d, class=%d, name=%@, age=%d", [student2 number], [student2 class], [student2 name], [student2 age]); } return 0; }
↓
2014-07-21 21:40:46.182 sample2[12447:303] Hello, World! 2014-07-21 21:40:46.184 sample2[12447:303] number=1, class=1, name=テスト 一郎, age=15 2014-07-21 21:40:46.184 sample2[12447:303] number=2, class=3, name=テスト 二郎, age=20 Program ended with exit code: 0
手抜き版
上記のクラスのヘッダー、実装は以下のようにすることも可能
student.h
// // student.h // sample4 // #import <Foundation/Foundation.h> @interface student : NSObject // プロパティ { int number; int class; NSString *name; int age; } // アクセサメソッドとして定義 @property int number, class, age; @property (copy)NSString *name; @end
student.m
// // student.m // sample4 // #import "student.h" @implementation student // アクセサメソッドを以下のように記載することでgeter,setterと同じように動作する @synthesize number, class, name, age; @end