[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を取り出す

といったところです。

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