すごくニッチな話ですけど、Xamarin Components にある Google Maps を Xamarin.iOS で使った。
このライブラリの中に CoordinateBounds
という「領域」を表すクラスがある。これは GMSCoordinateBounds の Binding だ。
で、CoordinateBounds には Including
(includingCoordinate) というメソッドがあって、これを呼ぶと指定した座標が入るように領域を拡幅してくれる、便利だ。
で、最初はこのクラスをこう使っていた。
var bounds = new CoordinateBounds();
bounds.Including(new CLLocationCoordinate2D(34d, 134d));
bounds.Including(new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));
動かしてみて、この使い方だと bounds
から期待した結果が得られないことに気づいた。範囲が -180〜+180 になってしまった。
正しくはこう。
var bounds = new CoordinateBounds(
new CLLocationCoordinate2D(34d, 134d),
new CLLocationCoordinate2D(33d, 133d));
bounds.Including(new CLLocationCoordinate2D(35d, 135d));
これだと結果は、正しく [33,133 - 35,135] を返す。
処理上、生成時に2つの座標が揃ってないケースだったので、「あ、デフォルトコンストラクタあるじゃん」と使ってたらハマった。本家 iOS 版の方には引数無しの initXXX は無かった。
Objective-C の仕様上 alloc して init しないのを防げない、んだっけ? だから、Xamarin.iOS の Binding でデフォルトコンストラクタを隠せないのかな? 突っ込んで調べてないけど、Binding ライブラリを使う時は注意しましょう、ちゃんと本家のAPIリファレンスを見ましょう、というお話でした。