普段Swift書いてますがXamarinに入門してみました

本エントリーは、[学生さん・初心者さん大歓迎!]Xamarin Advent Calendar 2016の22日目です。
昨日はsnagaさんXamarin入門してみたでした。
本記事も引き続き入門系のエントリーとなります。

はじめに

普段SwiftでiOSアプリを開発している筆者ですが、この度Xamarinに入門してみました(^^)
Xamarinの存在は以前から知っていましたが、普段Swiftで開発していることもありこれまで実際に触ったことは無かったのですが、今年はXamarin入門者の集い supported by teratailに参加し、そこで「今触っておかなければいけない気がする」と感じた次第です。
記事の内容はXamarinで普段からバリバリ開発されている方には常識的な内容かもしれませんがご容赦ください。

対象読者

  • 普段iOSのアプリをSwiftやObjective-Cで開発しているけどちょっとXamarinでの開発も気になっているというアナタ
    ※なお、本記事ではXamarin.iOSのみを対象としています。Xamarin.AndroidやXamarin.Mac、Xamarin.Formsについては触れませんのでご注意ください。

Xamarinについての情報収集

まずはXamarinを学ぶにあたっての資料をまとめてみました。

  • Xamarin公式ガイド iOS
    • Xamarinの公式ガイドです。iOS 10の新機能や目的別の実装方法など、リンクが豊富です。
  • Xamarinの歩き方
    • Japan Xamarin User Group(JXUG)主催でもいらっしゃるエクセルソフト田淵さんの資料です。Xamarinについて端的にまとめられていて、特にXamarin.Forms vs Xamarin ネイティブ vs XのスライドはXamarinの開発手法として何を選択すればいいのかを検討する際にとても参考になると思います。
  • 田淵さんのブログ
    • Xamarinについての説明や開発Tipsなどの情報もまとまっています。バグの共有なども行われているのでチェックしておくと良いでしょう。
  • Xamarin逆引きTips - Build Insider
    • 実践的なTips集です。プログラミング時にどう書けばいいかわからない場合はまずここをチェックしてみるといいでしょう。
  • Qiita
    • Xamarinタグで検索すると記事がたくさんあります。
  • クラスメソッド Xamarin – シリーズ –
    • Xamarinの記事が30本以上あります。
  • teratail
    • Xamarinタグをつけて質問すれば大体有識者の人が回答してくれるみたいです。

SwiftとXamarin(C#)を比較してみる

Xamarin.iOSはiOS APIの薄いラッパーということなので、SwiftとXamarin(C#)のコードをいくつか比較してみました。

開発環境

本記事のソースコードは以下の環境で検証しています。

  • mac OS Sierra バージョン 10.12.1
  • Xcode Version 8.1(8B62)
  • Visual Studio for Mac Preview 1 (7.0 build 347)

アラート表示

iOSのアプリでよく見かける以下のようなアラートを表示してみます。

alert

Swift

let ac = UIAlertController(title: "確認", message: "よろしいですか?", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default)
ac.addAction(action)
present(ac, animated: true)

Xamarin

var ac = UIAlertController.Create("確認", "よろしいですか?", UIAlertControllerStyle.Alert);
var action = UIAlertAction.Create("OK", UIAlertActionStyle.Default, null);
ac.AddAction(action);
PresentViewController(ac, true, null);

画面遷移(モーダル)

画面をモーダルで表示してみます。 遷移先の画面(ViewController)はStoryboardから読み込んでいます。

modal

Swift

// 表示
let storyboard = UIStoryboard(name: "Modal", bundle: nil)
let vc = storyboard.instantiateInitialViewController()!
present(vc, animated: true)

// 非表示
dismiss(animated: true)

Xamarin

// 表示
var storyboard = UIStoryboard.FromName("Modal", null);
var vc = storyboard.InstantiateInitialViewController();
PresentViewController(vc, true, null);

// 非表示
DismissViewController(true, null);

画面遷移(ナビゲーション)

UINavigationControllerのプッシュ遷移をしてみます。

push

Swift

// 遷移先ViewController生成部分は省略
navigationController?.pushViewController(vc, animated: true)

Xamarin

// 遷移先ViewController生成部分は省略
NavigationController.PushViewController(vc, true);

HTTP通信

通信してみます。今回はこちらのお天気Webサービスを使用させていただきました。httpなのでATS無効の設定をしています。XamarinでのATS無効化方法は後述します。(もちろん無効化せずにちゃんとATS対応するのが望ましいです)

Swift

// 東京の天気予報を取得
let url = URL(string: "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
    // 処理
}
task.resume()

Xamarin

// 東京の天気予報を取得
var url = new NSUrl("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
var task = NSUrlSession.SharedSession.CreateDataTask(url, (data, response, error) =>
{
    // 処理
});
task.Resume();

比較してこう思った

いやー、本当にラッパーですね!
クラス名とかメソッド名とかiOSアプリを作っている人であれば大体見当がつくので迷うことはなさそう。
インテリセンスも効くので快適です。

XamarinでATSを無効化するには

Info.plistのSourceでプロパティが追加できますが、ざっと見たところ、選択肢としてATS関連のものは用意されていなかったので、xmlを直接編集しました。 ATSを無効にするには以下を記述します。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

XamarinのUIデザイナーのここがイイ

Xamarinでも専用のUIデザイナーを使ってstoryboardを編集できます。 少し触ってみたので良いところをご紹介。

自動でInitial View Controllerになる

空のstoryboardに対してツールボックスからViewControllerをドラッグ&ドロップすると自動でInitial View Controllerになります。Xcodeでは自動ではならないので自分で設定する必要がありますが私はよく忘れます^^; 自動でやってくれるのはありがたいです。

designer_001

ViewControlerのクラスファイルを自動生成できる

Storyboard上でViewControllerのクラス名を入力してreturnキーを押すと対応するViewControlerのクラスファイルが自動生成されます。いちいち自分でファイルを追加する必要がありません。便利! designer_002 designer_003

ビューやボタンのクラスファイルも自動生成できる

実はViewControlerだけでなくUIButtonやUIViewなども同じ方法でクラスファイルが自動生成できちゃいます。便利(^^)

イベントハンドラーも自動生成できる

配置したボタンをダブルクリックするとイベントハンドラーも自動生成できます。 これはWindowsフォームやWPFのアプリを作ったことのある方にはおなじみですね!

designer_004 designer_005 designer_006

おわりに

今回はXamarin入門ということでXamarin.iOSを少し理解した筆者です。 Xamarinで開発するにもiOSやAndroidなど対象プラットフォームの知識は必要ですが、やはり.NET(C#)で書けるのはそれはそれで大きなメリットがあると思います。
今度はぜひXamarin.Formsも触ってみたいですね。

明日はcrocus7724さんです。お楽しみに!