イマドキっ子の Objective-C

イマドキの流行に敏感なキミだったらもう知ってるかもだけど、今日はそういうのに鈍感なオジサンたちのために、今風の Objective-C について書いちゃうよ。もちろん互換性的な感じで、すぐに変えられないかもってコもいると思うけど、知っててもソンじゃないから、いま覚えとこう!それとこういうのって、けっこー変わっていくものだから、半年後とかにはもう流行後れになるから注意してね!

インスタンス変数

Objective-C のインスタンス変数と言えば、ヘッダの @interface に書くというのがこれまでのルールでした。典型的な例として、以下のように書いていました。

@interface MyObject : NSObject
{
    NSString *aString;
}
...
@end

今風には、インスタンス変数の宣言は実装部の @implementation に書きます。

@implementation MyObject
{
    NSString *aString;
}
...
@end

宣言済みプロパティの場合は自動生成されますから、書く必要はありません。外部からアクセスする際にはアクセサを通すべきで、普通はプロパティを使いますから、インスタンス変数は隠蔽しておきます。

これらについて Apple の日本語ドキュメントにも書いてあります。『Objective-C プログラミング言語』の35ページ、クラスインターフェースの注記として書かれた部分には以下のようにあります(強調は筆者による)。

インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。

また37ページのクラス実装の項に、実装ブロックでのインスタンス変数の宣言について書かれています。

続きを読む

Excel 列名変換


Excel列名変換問題で第2回社内プログラミングコンテストを開催してみた

Perl 書けないので Ruby と Python で書いた。あとコマンドラインで引数渡して……という部分は省いて、それぞれ単純な関数にしてある。


Ruby

Ruby 1.9.3 で確認。

Python

Python 2.7.2、Python 3.2.2 で確認。


最初に Ruby の方を大体制限時間内で書いて、あとから友だちの Rubyist、@hidachinoiro に教えてもらったりしてリファクタリング。その後 Python に移植。

Perl で書くともっと難しそう。Ruby 最初からいろいろできて便利。Python は Ruby と同じことするのに3つもモジュールをインポートしてる1けど、やろうと思えばモジュール使わずに同じ機能を実装できる。コードの量は増える。

プログラミングコンテストとしては現実にありそうな良問だと思う。ただ慣れてる人ならもっと簡単に解けそう。


  1. Python 2 だけなら2つで良いけど Python 3 で reduce()functools に移動してた