@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 上のものを使うのですが、このあたりは、適当に使い慣れたほうをベースにするのが良いかと。
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 クラスの中身は空っぽです。
Public Class App Inherits MvxApplication Public Sub New() End Sub End Class
実行する
サンプルコード
MxSingleApp 内の MvxVB.* の類がそれです
https://github.com/moonmile/MxSingleApp