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

といったところです。

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

Pebbleの便利なところ

Pebble、日本語表示できない致命的な不便さはあるものの、それを差し引いてもいろいろと便利で気に入っていて、ずっと使い続けてます。自分にとっての便利な点を並べてみました。

1.Authenticator

AzureとかAWSなどを仕事で使っている関係もあって、これが地味ながらスゴく助かってます。スマートフォンのAuthenticatorよりはるかに手軽で便利です。スマートフォンのAuthenticatorアプリとコレでMFAトークンの冗長化にもなるのもよいです。
専用のMFAデバイスでまれに発生する”電池切れでトークン消失”になる心配もありません。

Pebble Authenticator

Pebble Authenticator

2.バイブレーションのアラーム

これはPebbleでなくてもそういう機能が入っている普通の時計もあることを知ったのですが、今までそのことを意識してなくて、Pebbleを使い始めて気づきました。バイブレーションのアラームを設定して、時計をつけたまま寝れば、家人を起こすことなく自分だけムクリと起きることが出来ます。絶対に寝坊できない時でも、バイブレーションだと確実に起きられるのもありがたいです。

登山で山小屋の大部屋に泊まった時、他の人を起こさないようにしたまま自分だけ起きて早立ちすることにも使えて趣味的にもステキです。

3.スマートフォンで聞く音楽のリモコン機能

スマートフォンで聴いてる音楽をPebbleで画面表示して、曲のスキップとか音量の調整を行うことができます。普段わりと音量大きめでガンガンに聞きたい派なので、電車に乗る時にスマートフォンをいちいちポケットから出さずに操作して音量を小さくできたりするのは、特に電車ではありがたいです。

4.1週間近く持つバッテリー

上に挙げた機能をバッテリーを気にせずにいつでも使えるのが素晴らしく良いです。充電は本当に全く気にしないで使ってます。時計にとって、コレが一番大事ではないかと思います。

一番安いバージョンはデザインが安っぽいとか、日本語表示できない致命的さなどの残念なところもありますが、自分にとってはコレだけで毎日使う十分な理由になってます。