53522


お世話になっております。

Xamarin.iOSで開発をしているのですが、以下のエラーに悩まされています。

[code]

    [__NSCFNumber toDouble]: unrecognized selector sent to instance 0x8128ca9af651a24b
    
[/code]

エラーが発生しているプログラムの一部がこちらです。

[code]

    public void SetData(JSValue val)
    {
        if (val.HasProperty("data"))
        {
            JSValue obj = val.GetProperty("data");
    
            if (obj.HasProperty("position"))
            {
                if (obj.GetProperty("position").IsArray)
                {
                    JSValue[] ary = obj.GetProperty("position").ToArray();
                    if (ary.Length > 3)
                    {
                        throw new Exception("RangeError: invalid array length about 'position'.");
                    }
    
                    for (int i = 0; i < ary.Length; i++)
                    {
                        position[i] = ary[i].ToDouble(); // ここでエラー発生！
                    }
                }
                else
                {
                    throw new Exception("Type error: 'position' must be 'double[]'.");
                }
            }
        }
    }
    
[/code]

やりたいことはJavaScriptCoreに読み込ませた以下のjsから`position`の数値を取得することです。

[code]

    var test = { data: { position: [1, 1, 1] } };
    
[/code]

とりあえず変数`ary`に`position`の配列が来ていることは`position: [1,1,1,1]`で試して例外が発生したので確かめています。

エラー自体は調べたらたくさん出てくるのですがどれもSwiftでのエラー回避ばかりでC#(Xamarin.iOS)で有効な策が見つかりませんでした。

この質問が一番期待できたのですが、  
[What causes “unrecognized selector sent to class” error on Xamarin Forms
build?](https://stackoverflow.com/questions/52413921/what-causes-unrecognized-
selector-sent-to-class-error-on-xamarin-forms-build/52425683)  
Xcodeのバージョンを確認してシミュレーターのアップデートを行ってみましたが特に解決しませんでした。

何か情報がありましたら教えてください。


CC BY-SA 4.0
2019-03-15T07:31:12.930
53448
2019-03-18T07:54:33.477
31396
question
ios c# xamarin
Xamarin.iOSでJSValueの値が参照できていない


試行錯誤していたらエラーを回避して、やりたいことを実現する方法がわかりました。

[code]

    public void SetData(JSValue val)
    {
        if (val.HasProperty("data"))
        {
            JSValue obj = val.GetProperty("data");
    
            if (obj.HasProperty("position"))
            {
                if (obj.GetProperty("position").IsArray)
                {
                    // ToArrayせずにJSValueのまま扱う
                    // JSValue[] ary = obj.GetProperty("position").ToArray();
                    JSValue ary = obj.GetProperty("position");
    
                    // 長さを知りたいときだけ配列化する
                    // if (ary.Length > 3)
                    if (ary.ToArray().Length != 3)
                    {
                        throw new Exception("RangeError: invalid array length about 'position'.");
                    }
    
                    for (int i = 0; i < 3; i++)
                    {
                        // position[i] = ary[i].ToDouble(); 前はここでエラー発生！
                        position[i] = ary[(nuint)i].ToDouble();
                    }
                }
                else
                {
                    throw new Exception("Type error: 'position' must be 'number[]'.");
                }
            }
        }
    }
    
[/code]

原因は不明なのですが、上記のプログラムで動きました。  
解決した方法としてここに自己回答しておきますが、根本的なエラーの回避策として正しいのか不明なので承認は少し待とうと思います。

これが原因だったんだよというものがありましたら、回答していただけると嬉しいです。


CC BY-SA 4.0
2019-03-18T07:54:33.477
53522
2019-03-18T07:54:33.477
31396
53448
answer