細かいことや例外的なことは後回しでいいので、手っ取り早くObjective-cを理解して使い始めたいという人向けです。他言語を経験していることが前提です。
その3は変数とプロパティ(@property)です。
#ローカル変数
メソッド内で使う変数。
メソッドの中で宣言して使う。
#インスタンス変数
インスタンス(クラス)内で使う変数。
@implementationの{}下で宣言する。
QiitaTest.m
#import "QiitaTest.h"
@implementation QiitaTest {
NSInteger height; // インスタンス変数1
NSInteger weight; // インスタンス変数2
}
- (void)testMethod {
:
}
@end
#プロパティ
外部に公開するインスタンス変数はプロパティとして書く。
突き詰めると深みがあるのだが、以下のように宣言して使えばよい。
ヘッダファイルに宣言する。
QiitaTest.h
#import <Foundation/Foundation.h>
@interface QiitaTest : NSObject
@property NSInteger height; // プロパティ1を宣言
@property NSInteger weight; // プロパティ2を宣言
@end
ViewControllerから使う例。
ViewController.m
#import "ViewController.h"
#import "QiitaTest.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
QiitaTest *test = [[QiitaTest alloc] init];
test.height = 174; // heightプロパティにセット
test.weight = 65; // weightプロパティにセット
NSLog(@"HEIGHT=%ld WEIGHT=%ld", test.height, test.weight); // プロパティをゲット
}
@end
実行結果。
2017-12-02 08:18:48.467 QiitaTest[923:25872] HEIGHT=174 WEIGHT=65
#プロパティをクラス内から使う
クラス内でインスタンス変数として使うときは、プロパティにアンダースコアをつける。
QiitaTest.h
#import <Foundation/Foundation.h>
@interface QiitaTest : NSObject
@property NSInteger height;
@property NSInteger weight;
- (void)consoleWright;
@end
アンダースコア付きインスタンス変数として、クラス内のメソッドから使う。
QiitaTest.m
#import "QiitaTest.h"
@implementation QiitaTest
- (void)consoleWright {
NSLog(@"HEIGHT=%ld WEIGHT=%ld", _height, _weight); // インスタンス変数として使う
}
@end
ViewControllerからプロパティとメソッドを使う例。
ViewController.m
#import "ViewController.h"
#import "QiitaTest.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
QiitaTest *test = [[QiitaTest alloc] init];
test.height = 174;
test.weight = 65;
[test consoleWright];
}
@end
#プロパティについてもっと知りたい人
- Objecitive-c V1までは@propertyは無かった。よってインスタンス変数にアクセスするためには、セッターとゲッターというメソッドをいちいち実装する必要があった。
- @propertyを使うと、セッター&ゲッターメソッドが省略できて(コンパイラが作ってくれる)、外部から使う時にドット演算子を使って「インスタンス.プロパティ」の形でアクセスすることができる。実は有難い。
- .hヘッダファイルでpropertyで宣言すると、.m実装ファイル側でインスタンス変数が勝手に実装される(コンパイラが作ってくれる)。その際の名前が「_プロパティ」となる。
- _付きのインスタンス変数名を使いたくない場合は、@synthesizeを使って別の名前や、プロパティと同じ名前に変更することができる。
###参考URL
ぶっちゃけiOSアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。