RubyMotionをはじめる人が最低限知っとくべきObjC

# はじめに

RubyMotion Advent Calendar 2013の22日目の記事です。

この記事は

 * ObjCを勉強する気はない
 * Xcodeを勉強する気もない
 * RubyMotionで、一日も速くアプリを書きはじめたい

という僕みたいなせっかちな人に向けて書きました。

RubyMotionは、たしかにそういう人にうってつけです。

でも、iOS SDKの使い方は理解できなくてはならず、そういう意味で、ObjCを書く必要はないのですが、ObjCのサンプルコードを読んでRubyに書き換えられる必要はあります。

今回は、

* __ObjCを書かないけど、なんとなくよんで理解でき、Rubyに書き換えられる__

程度にはなるために、最低限知っておくべきことをメモしてみたいと思います。

なお、一つ言っておくと、未だに僕自身、ObjCを一切書いた事がないし、Xcodeも一度も起動したことがないです。
でも、RubyMotionのコードは、5000行近く書いてます。:p


## メソッド


```objc:Objective-C
[string drawAtPoint:point withFont:font];
```

```ruby:RubyMotion
string.drawAtPoint(point, withFont:font)
```

ObjCでのメソッドの記述は

* 全体を角括弧([])で囲む
* インスタンスやクラスとメソッドの間はスペース一個分空ける
* メソッド名と第一引数の間にコロンが入る
* メソッド引数の区切りもスペース
* 第二引数以降に「キーワード」がつく(詳しくは [1.1. Objective-C Messages](http://rubymotion.jp/RubyMotionDocumentation/guides/runtime/index.html#_objective_c_messages) )
* クラスメソッドも同様

## 文字列

```objc:Objective-C
@"ほげ"
```

```ruby:RubyMotion
"ほげ"
```

* ObjCでは、ダブルクォートの前に「@」をつけます。

## セレクタ

```objc:Objective-C
@selector(hoge)
```

```ruby:RubyMotion
'hoge'
```

セレクタは呼び出してほしいメソッドを指定したりするのによく使われます。
RubyMotionではただ文字列を渡せばその文字列のメソッドが呼ばれます。


## ブロック

```objc:Objective-C
[UIView animateWithDuration:0.1f
                 animations:^{
                     // アニメーションをする処理
                 }
                 completion:^(BOOL finished){
                     // アニメーションが終わった後実行する処理
                 }];
```

```ruby:RubyMotion
UIView.animateWithDuration(0.1,
                 animations: lambda {
                     # アニメーションをする処理
                 },
                 completion: lambda { |finished|
                     # アニメーションが終わった後実行する処理
                 })
```

* ObjCでは ```^(引数) { ... }``` で、ブロックになります。
* RubyMotionに書き換える場合は、```lambda``` を使うか、```Proc.new {}``` を使うかです


## autorelease

```objc:Objective-C
Hoge *hoge = [[[Hoge alloc] init] autorelease];
```

```ruby:RubyMotion
hoge = Hoge.alloc.init()
```

RubyMotionでは、自動的にメモリ管理されるので、メソッド呼び出し時の最後の引数、autoreleaseという記述は書かなくてOK。


## ヘッダファイル

* RubyMotionはヘッダファイルは全く書かなくてOK

## クラス宣言

```objc:Objective-C(ヘッダファイル内)
@interface MyClass : NSObject {
}
@end
```

```ruby:RubyMotion
class MyClass < Object
end
```

## メンバ変数

```objc:Objective-C(ヘッダファイル内)
  NSString *lyrics;
```

```ruby:RubyMotion
@lyrics
```

## 型宣言

* RubyMotionでは型を書く必要がないので、すべて消す。
* ちなみに id型 という型がありワイルドカード的型指定として使える (はじめて見た時、idってなに??? と思った)

## 配列

```objc:Objective-C
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", nil];
```

```ruby:RubyMotion
array = ['aaa', 'bbb', 'ccc', 'ddd']
```

* arrayWithObjectsというメソッドの引数に与えまくって作る
* 引数の最後に「nil」を指定して、終端を教えている
* 他にも作るためのメソッドはいくつかある

## ハッシュ

```objc:Objective-C
NSMutableDictionary *hash = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    @"val1", @"key1",
    @"val2", @"key2",
    @"val3", @"key3",
    nil
];
```

```ruby:RubyMotion
hash = {"key1" => "val1", "key2" => "val2", "key3" => "val3"}
```

* NSMutableDictionaryのdictionaryWithObjectsAndKyesメソッドに引数で与えまくって作る
* val1, key1, val2, key2 のような順番になる
* 最後にnilを渡してあげる必要がある
* 他にも作るためのメソッドはいくつかある


# 最後に

* とりあえず、せっかちな人向けなのでこの辺で。
* とはいえ、[RubyMotion Runtime Guide](http://rubymotion.jp/RubyMotionDocumentation/guides/runtime/index.html#_objective_c_messages)
 はまず最初にざっと目を通した方が良いと思います。
* というか、やはりObjCはざっくりさきに軽く勉強しておいた方が間違いがないです^^; [Cocoaの素、Objective-Cを知ろう](http://www.atmarkit.co.jp/ait/articles/0809/09/news142.html) の連載記事が分かりやすそうでした。