2017年1月20日金曜日

[__NSArrayI pointValue]: unrecognized selector sent to instance ...


swiftでコーディング中に次のエラーが発生した
[__NSArrayI pointValue]: unrecognized selector sent to instance

NSArrayにセットしたオブジェクトがCGPointと想定されるが、それ以外の値がセットされている場合に発生する。

Googleで検索するとintの場合なども出てくる。
[__NSArrayM intValue]: unrecognized selector sent to instance

私の場合、Appleのドキュメントにある次のサンプルに倣ってCABasicAnimationに数値のArrayをセットしたところ発生した。
let animation = CABasicAnimation(keyPath: "position")
animation.fromValue = [0, 0]
animation.toValue = [100, 100]

単独のアニメーションはこれで動作するが、ループで繰り返し実行中にデバイスを回転させると上記エラーが発生する。

次のように変更するとエラーが発生しなくなる。
anim.fromValue = CGPoint(x:0, y:0)
anim.toValue = CGPoint(x:100, y:100)

CABasicAnimation のfromValue、toValueはkeyPathによって異なる値をとるので、なんでもセットすることができてしまう。
"position"の場合は基本的にはCGPointとswiftのArrayの両方に対応しているが、どこかに未対応のところが残っているため、発生するのだろう。

このようなエラーが発生した場合はObjective-Cのドキュメントを参照し、その場合と型が異なっていないかチェックしてみるとよいでしょう。