[Swift]戻り値に指定されたGenericsの型のインスタンスを取得する

例えば以下のような戻り値のみGenericsとしているメソッドがあったとして、C#でいうところの new T(); と書くような感じで、メソッド内でGenericsの型のインスタンスを取得しようとしたら、そのままではコンパイルエラーとなり少し悩みました。

“because it has no accessible initializers” とあるので、要するにinitがあれば良いのだろうということで、以下のように対象のクラスにinitを持つプロトコルを実装させて、GenericsTypeもそのプロトコルで縛りを入れてみたところ、正しくコンパイルできるようになりました。

これで、以下のコードで動くようになりました。

ネットで見かけるサンプルが、どれも引数と戻り値の両方がGenericsとされている形式だったので、ふと疑問に思ってやってみた次第です。

ちょっと面倒な感じですが、仕様としては正しい動きでしょうか。
init(コンストラクタ)をProtocol(インターフェース)にできるのは、地味に良い仕様であるように思いました。

[Swift]Any型に代入したOptional型の値をアンラップできない?

作りたいアプリがあって、3週間前からポチポチとSwiftを書いてまして、Optional型のメンバを持つ型に対してreflectをかけたあとでかるくハマったので、メモ代わりに書いておこうかと。

Swift 1.2
Xcode 6.3
で試しています。

以下のように、Any型の変数にStringを代入した場合、キャストすればそのまま取得できますが、

(コードは Quick/Nimble のSpecとして書いてます)

Any型にString?を代入した場合は、なぜかうまくアンラップすることができません。

これだと明示的にAnyにOptional型の値を代入しなければよいですよね、ってなるんですが、自分の場合は、以下のMirrorTypeでメンバーにアクセスした際に発生しました。

というクラスがあった場合に、reflect関数を使って、以下のようにメンバーにアクセスします。

なんとなくバグっぽい気がしますが、調べてみるとやはりstackoverflowにも上がってました。

How to unwrap an optional value from Any type? (2015年1月ごろの投稿です)

対応策はあまり大したものがなくて、

  1. Anyに拡張メソッドとしてアンラップした値を返却させる処理を追加する
  2. reflect関数とMirrorTypeを使ってAny型の変数からvalueを取り出す

といったところです。

また忘れた頃にハマりそうな予感がします・・

あけましておめでとうございます(笑)

というわけで、何だか気がついたら年を越してしまっててびっくりなのです。

昨年末まではコード書いてインプロやっての毎日で、年越しは実家に帰省しましたがあんまり休んだ気がしなくて、そして、年明けからもずーっとコード書いてインプロやっての毎日でした。最近は、仕事の方が密度濃いですね。ずっと作ってたのがおっきく形になってきたので、だいぶ面白くなってきたところです。やはりモノ作りは、形になってきてからが楽しいですね。
このところはほぼ毎日楽しくお仕事をして、夜中前に帰ってくるような日々です。

私のプログラミングは、人から頼まれたり言われたりしてやっている仕事がほとんどで、インプロやり始めた以後の仕事以外の時間においては、プログラムを「書いている」とは言えない程度でしかコーディングをしていないため、ということは自分もいわゆる某所で言われているような「職業プログラマ」なのかなあと思うのです。

ですが、人から言われている仕事ばかりしているから成長しないとか、そういう仕事だと自分では考えないとか、作りたいモノを作っているといろいろ自分で考え悩むからこそ力がつく・・・といったことは全然思いませんですね。

以前に、全員何らかのモノ作りをしている人たちだけで集まった、クリエーター異業種交流のようなものが偶然にあったのですが、そこでとあるデザイナーの方が、「むしろ、依頼された仕事や要求に制約があった方が楽しいし、知恵を絞ることで創造性が発揮される」というようなことを話しているを聞いて、自分も全く同感に思いました。実のところ、創造性って、人から頼まれる仕事とか自分で好きにやる仕事などのように、環境や条件がどうのこうのって訳じゃなくて、創造性そのものを自分自身で発見したり作り出せたりできるかどうかが、その人がモノ作りをできているかどうかの分かれ目になるのじゃないかなあと思います。

人から頼まれた仕事であっても、十分にアイディアを出して、悩んで、工夫して、新しい技をひねり出して、チャレンジして成長することは十分にできますし(当たり前ですよね)、逆に、自分で自由に作りたいモノを作ろうと思ったら、決まった納期がないせいでだらけてしまい、そのうちやる気を失って成長どころじゃない(笑)ということだってあるわけです。

またここでSHELL:MAKURA的な話をすると、例えば、伝統芸能の狂言なんかは、個性や創造性を否定するところが出発点だったりします。舞で手を上げる仕草があった場合、手を上げすぎたら師匠が手の上を叩き、手を下げすぎれば師匠が手の下を叩きます。確実に師匠と全く同じ動きができるようになるまでは、何度も同じ稽古を「言われたとおりに」繰り返さなければならず、そしてそこには個性も独創性は微塵もありません。むしろそういったものは邪魔になります。

ところが、そうして長い間稽古を続けていくとやがて不思議なことが起きます。

全員が師匠に教わった通りに舞台で動き、役を演じているのにもかかわらず、逆に「同じ動きをしているがために」個性がかえって際立ってくるのです。そうして生まれたものは、つまり同じ動きをしていても隠しようのない個性であり、実に揺るぎのない存在感を放ってきます。するとそこに、その人がいるだけで発生する創造性が生まれてきて、誰もその人を否定することができなくなるのです。初めて狂言を見たときに、自分はそのことにいたく感動しました。野村萬斎氏が言うところの「狂言を自分の身体にプログラミングする」ということが、真なる創造性を生み出すためのシステムとして、大昔から現代まで脈々と受け継がれてきているのです。そんな訳で、狂言の世界でお仕事をされている方々は「職業狂言師」だと思いますが、人から言われている仕事をしているだけで、見事に何百年も狂言そのものを進化させ続けていると思うのです。

なんだか話が(SHELL:MAKURA的に(笑))ずれてきていますが、そんなわけで、私自身は今年も職業プログラマとして、言われる仕事の中でたくさん自分で考え、工夫をし、時間の制約の中で悩み抜いて、たくさん濃いモノ作りをしたいと思います。自分の能力で他人に唯一自慢できるのが、「言われてやる仕事を面白くする名人」であることなので、私にとっては、職業プログラマ上等!と言いたいくらいです。

とはいえ、他人に自分の作ったアプリケーションやコードを見せることにもとても興味があるので、今年はそっちもやりたいなあと(笑)。言われる仕事だけでコードを書き続けてきた自分の力が、どれだけなものなのか試してみたいというか。

そんなこんなで、今年もよろしくお願いします(笑)。