@yusuke_kokubo そんなことはないですよ?F#も使えます。
— Openゆとり?( ・?・)? ?? (@megascus) 2014, 12月 1
これに「VB でも作れますよ」の返答をしたいだけに、Xamarin.iOS で VB を使ってみました。まあ、正確には、
- ViewModel を VB の PCL で作る
- フロントを Xamarin.iOS の C# で作る
訳で、アプリ全体を VB では作ってはいませんが。F# の場合、アプリ全体も作れるので、なんとか工夫すれば VB でも作れると思うのですが、View 部分をコードで書かないといけないし、結構面倒なことになるので、VB+C# のハイブリッド型ということです。Xamarin + Microsoft が C# 押しをしている(ように見えるのは)単一言語で同一の .NET Framework(One.NET)で使えるよ~、という意味で、入り口の取り方としては Java と似ているかなと。多様性という点では、C#/VB/F# と揃っていたほうがいいし、Visual Basic には C# の後追いじゃなくて初心の「初心者にも使える」を押してほしいなと思ったり。この話は別途書くつもり。
フロントエンドは C# のまま
Xamarin.iOS+MvvmCrossでstoryboardを使う方法(MvvmCross v3.2.2 対応) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6685
で作ったものを流用します。できれば、プロジェクトの参照設定だけを VB の PCL に変えればいいのですが、最初から作ったのでいくつか嵌りました(汗)。
storyboard ファイルを、C# のプロジェクトからコピーしたものの、Main Interface に設定するのを忘れていて、画面が真っ黒になってあれ?と悩んだり、
Xamarin.iOS が 64bit 化の過渡期なので、MvvmCross が monotouch を要求するので Xamarin.iOS と差し換えたりと。
さっくり 30 分で作って返答するつもりが、夜中に2時間ほどかかっていましたよ。
バックエンドを VB で作る
ViewModel を VB の PCL で作ります。Xamarin Studio では完結しないので、ここでは Visual Studio を使います。まあ、もともと Windows 版の Xamarin Studio では Xamarin.iOS の開発ができないので、Mac 上のものを使うのですが、このあたりは、適当に使い慣れたほうをベースにするのが良いかと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | Namespace ViewModels Public Interface ICaluculation Function TipAmount(subTotal As Double , generosity As Integer ) As Double End Interface Public Class Calculation Implements ICaluculation Public Function TipAmount(subTotal As Double , generosity As Integer ) As Double Implements ICaluculation.TipAmount Return subTotal * CType (generosity, Double ) / 100.0 End Function End Class Public Class TipViewModel Inherits MvxViewModel Private _calculation As ICaluculation Public Sub New () _calculation = New Calculation() Start() End Sub Public Overloads Sub Start() _subTotal = 100.0 _generosity = 10 Me .Recalcuate() MyBase .Start() End Sub Private _subTotal As Double Private _generosity As Integer Private _tip As Double Public Property SubTotal As Double Get Return _subTotal End Get Set (value As Double ) _subTotal = value RaisePropertyChanged( Function () SubTotal) Recalcuate() End Set End Property Public Property Generosity As Integer Get Return _generosity End Get Set (value As Integer ) _generosity = value RaisePropertyChanged( Function () Generosity) Recalcuate() End Set End Property Public Property Tip As Double Get Return _tip End Get Set (value As Double ) _tip = value RaisePropertyChanged( Function () Tip) End Set End Property Private Sub Recalcuate() Tip = _calculation.TipAmount(SubTotal, Generosity) End Sub End Class End Namespace |
RaisePropertyChanged メソッドに引き渡すラムダ式の書き方をちょっと悩みますが、Function() SubTotal な感じ書きます。式木になるので、Function() … End Fuction ではダメなのですね。素直にプロパティ名を文字列で書いてもいいかもしれません。
例によって、App クラスの中身は空っぽです。
1 2 3 4 5 6 | Public Class App Inherits MvxApplication Public Sub New () End Sub End Class |
実行する
サンプルコード
MxSingleApp 内の MvxVB.* の類がそれです
https://github.com/moonmile/MxSingleApp