m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Objective-Cの学習2(クラスのアクセサメソッド)

最近、気になっていること

システムインテグレーターは提供するのは労働力なのか技術なのかはたまた従順な姿勢なのかどうなんだろうか…

クラス定義

Objective-Cc言語などと同様にヘッダーファイルにプロパティの定義などを行い、実装でメソッドなどを定義するようです。

ヘッダー(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

所感

インテリセンスがあると楽です(^^)
全部1つ1つ記載するのではスペルをおぼえなくてはいけないけど記載する項目が多くなる場合は
xodeなどでコードの保管をしてくれるので便利な感じ

ただ、javaeclipseはなんか挙動が怪しいのであれですけど…

メソッドの定義やアクセスの方法が少しわかったのでアプリ開発に少しずつ進歩しているのかな…
仕事で覚えなくてはいけないことがあったり、趣味てやったりとしているけど同じことをずっとやっていると
だんだんモチベーションが下がってしまうので時々いくつかのものを一定でやるようにしている。