こんにちは、エンジニアのオオバです。
普段書かないプログラミング文法ってしまいませんか?似ている言語ならまだしも、文法構造が大きく違う言語は少し時間が経つと記憶喪失になったかなってくらい忘れてしまいます。
今回のお題は「Objective-C」です。
オオバは普段C#、Python、JavaScriptを記述しています。Objective-Cって文法が全然違うんですよね。関数1つ呼び出すのも一苦労。
Unityが提供する機能をそのまま使う分にはObjective-Cは登場しませんが、Unityから一歩外に出ようとするとそこはアンセーフな世界。ネイティブプラグインを開発してOS独自の機能にアクセスする必要が出てくるのです。
そんな時にObjective-Cなどが登場します。そこで本記事ではObjective-Cの文法を忘れないための備忘録としてまとめていこうと思います。
Objective-C以外にもC++でネイティブプラグインを開発するときもあります。こちらの記事ではC#からC++アクセスの基本として文字列を受け渡す方法を紹介しているのでネイティブプラグインに興味ある方はぜひ確認してみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
Objective-Cメソッド文法集図解
どのプログラミング言語でもメソッドの書き方は何通りか存在します。代表的な分岐は次の2つです。
- 引数あり、なし
- 戻り値あり、なし
引数と戻り値はどの関数でも登場します。その他にインスタンスメソッドなのかクラスメソッドなのかという分岐も登場します。
まずは基本編として、引数ありなし、戻り値ありなしの文法をマスターしていきましょう。
引数なしインスタンスメソッド
まずは引数なしインスタンスメソッドについて。メソッドの中では 最も基本となる文法 です。
- (BOOL) printExistFile{}
こちらがObjective-Cの引数なしインスタンスメソッドです。図解で説明すると以下のようになります。
「-(ハイフン)」「メソッド名」という2つの要素で構成されているため、比較的覚えやすいです。戻り値の型に 括弧() をつけるのを忘れないようにしましょう。
次にインスタンスメソッドの実行方法を紹介していきます。
BOOL isExists = [self printExistFile];
文法は上図の通り。比較的C#と似たような文法ですが、メソッド実行には 角括弧[] を使用する点に注意が必要です。
引数を1つ持つインスタンスメソッド
次に引数を1つ持つインスタンスメソッドの文法についてです。
- (BOOL) printExistFile : (NSString*) targetFilePath{}
少しコードが長くなりました。図解すると以下です。
引数の型にも括弧が付きます。メソッド宣言時の型(戻り値の型、引数の型)には括弧()がつくことをまず覚えておきましょう。
そして、引数の手前、メソッド名の後ろに「:(コロン)」がつくのも特徴なのでぜひ覚えておきましょう。
BOOL isExists = [self printExistFile : @"img.png"]
引数を1つ持つメソッドの実行文法は↑こちらです。
メソッド実行時の引数記述前に「:(コロン)」が必要なので注意です。
引数を2つ以上持つインスタンスメソッド
次に2つ以上の引数をもつインスタンスメソッドについてです。引数が2つ以上の場合「ラベル」という概念が登場します。
- (BOOL) printExistFile : (NSString*) targetFilePath count : (NSInteger) count {}
かなりコードが長くなってきました。下の図解を確認していきましょう。
第2引数から「ラベル」「型」「引数名」という記述になります。ラベルの後に「:(コロン)」をつけることも忘れないようにしましょう。
BOOL isExists = [self printExistFile : @"img.png" count : 100];
メソッド実行分も長くなってきました。↓の図解で内容を確認していきましょう。
第2引数からラベルが登場します。ラベルの後の:(コロン)に注意です。
引数を2つ以上持つメソッドはこのルールに従っていきます。
// 宣言
- (BOOL) testMethod : (NSString*) name age : (NSInteger) age nickName : (NSString*) nickName {}
// 実行
BOOL flg = [self testMethod : @"shibuya" age:42 nickName : @"baon"]
こんな感じで引数を2つ持つメソッドのルールに従います。
Objective-Cメソッドの「宣言」文法5つのポイント
今後Objective-Cのメソッド宣言文法を忘れないようにポイントをまとめておきます。
- インスタンスメソッドは 「-(ハイフン)」 始まり
- 宣言に登場する型全てに 「括弧()」 をつける
- メソッド名の後に 「:(コロン)」 をつける
- 第2引数以降に ラベル を付与
- ラベルの後には 「:(コロン)」 が必要
Objective-Cメソッドの「実行」文法のポイント
次にObjective-Cのメソッド実行文法のポイントです。
- メソッド全体は 「角括弧[]」 で囲む
- 呼び出し元が 自分(self) であっても必ず記述
- メソッド名の後ろに 「:(コロン)」 が必要
- 第2引数から ラベル が必要
- ラベルの後には 「:(コロン)」 が必要
特に第2引数からラベルが必要になるのを忘れやすため注意です。
Objective-Cの学習方法
プログラミングの文法を覚えるには実践(実際に書く)あるのみです。
例として前回記事の処理をメソッド化してみます。
↑こちらの記事内で紹介した処理を「printExistFile」というメソッドを宣言してにまとめてみたいと思います。
↓完成したソースコードはこちらです。
💻ソースコード : printExistFile.m
- (BOOL) printExistFile:(NSString*) targetFilePath
{
// 【1. ファイルまでのパスを作成】
// ダウンロードした画像が格納されたディレクトリパス取得(適宜変更してください)
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// ファイルパスの作成
NSString *filePath = [[dirPaths objectAtIndex:0] stringByAppendingPathComponent:targetFilePath];
// 【2. NSFileManagerを取得】
NSFileManager *fileManager = [NSFileManager defaultManager];
// 【3. NSFileManagerのfileExistsAtPathメソッドを実行】
// fileExistsAtPathメソッドでファイルの有無確認
BOOL isExist = [fileManager fileExistsAtPath:filePath];
// 1が出力されたら存在する
NSLog(@"isExist: %d", isExist);
return isExist;
}
少しソースコードが長いですが、今回学んだメソッド宣言文法を使って実装できました。
BOOL isExists = [self printExistFile:@"img.png"];
メソッド実行する時は上記のように記述します。忘れやすいポイントを抑えつつ「実践」して記憶の定着につながったのではないかと思います。
まとめ
Unityエンジニアは普段使わニアObjective-C文法を忘れやすいです。iOS開発をするにしても、今はSwift一択のため、Objective-Cを使うことが本当にありません。
しかしUnityでiOSプラグインを作る時にObjective-Cは登場します。Swiftを実行するための橋渡しとして使ったりするのです。
時々使用するプログラミング言語の思い出しコストを最小限にするためにも本記事をぜひ活用していただければと思います。

筆者のXをフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいObjective-Cライフをお過ごしください。