JavaプログラマがXcodeでiPhoneアプリを作ってみる.5週目

今週は調査段階で解決できなかったトピックスがいろいろあります。


Xcode 6 beta 5にバージョンアップ

2週間単位でbeta版がバージョンアップしていき、その度に何かしらのSwiftの言語仕様が変更されていきます。今回は、コンストラクタでinitの前にrequiredを書いたり、nilチェックを!xと書いていた箇所をx != nilに直す必要がありました。まだOptional型に関するライブラリ周りの微調整が発生しているようです。


Swift

Swifの特徴は、静的な型をもつクラス型のオブジェクト指向言語であると同時に、関数が「第一級市民」とか「Optional型」とか「タプル」とか「パターンマッチング」をもつ関数型言語でもあります。実際使ったことがないので間違っているかもしれませんが、この辺りの特徴はまんまScalaです。Swift関数型言語の部分が使えるようになるとScalaも理解できるようになるのでしょうか?


XUnit

Swiftでプロジェクトを作成すると、メインのプログラムを書くディレクトリと共に、test用のディレクトリも作られます。スケルトンで作らるクラスはXCTestCaseを継承しており、setUp()、tearDown()やtestから始まるとテストメソッド等、JUnit3の頃に似た作りになっています。もちろん最初から作らているクラス以外にも手動で新規クラスを作ることもできて、XCTestCaseを継承したクラスを作ると自動的にテスト実行時の対象に含まれるようになりました。だいたいJUnitと同じとう理解でいいような気がしますが、AllTestsに相当する概念は無いかもしれません。また、なぜかメインディレクトリのクラスを呼び出すことがで来なかったため、具体的なテストが書けませんでした。
Objective-Cの頃は、JUnitと同じく公式のテストクラス以外にも様々な拡張モジュールがあったようで、Swiftでもビヘイビア駆動のQuickとか、テスト用にモックがつくれるOCMockとかが使えそうです。このあたり、もう少し落ち着いた頃に再調査してみるつもりです。

2014/8/11追記:Target MembershipにTestsを追加するとテストからメインプロジェクトのクラスが呼べるようになるようです。


例外処理

Java使いなので自然とtry-catchに該当する機能を探してしまったのですが、どうも例外処理という概念は無いようです。
参考サイト:Swiftのエラーハンドリング
どうにかして、実機でクラッシュした時に情報を取得したいのですがどうすればいいのでしょうか。。


UI周りその1

そろそろデザイナーチームと連携を取りながら作業をしたいのですが、StoryBoardのmergeがネックになっています。互いに関連のないViewを修正してもStoryBoardのファイルが1ファイルなのでコンフリクトが発生します。どこかで、1アプリ1ストーリーボードが推奨というのを見た気がするのですが、StoryBoardを分割してみようと思っています。現在はっきりしているデメリットは、Segueが使えなくなることです。
参考サイト:Storyboardを1画面ごとに分割した話


UI周りその2

デザイナーが作ったPhotoShopのイメージをXcodeのViewに落とす作業を始めたのですが、UITextViewに余白(CSSのpaddingにあたるもの)を設定しようとしてつまりました。結局コードでUIEdgeInsetsを設定して対応したのですが、もっと楽に実現する方法があったら教えてください。


デバッグ

エミュレータのbreak pointがずれることがあるようです。アプリでクラッシュする箇所があったのでブレークポイントで止めて少しずつ進めながら問題の箇所を特定しようとしていたのですが、クラッシュしたところからもう少し先の行のコードに問題があったとうことがありました。また、同じ箇所を実機で動かすと、ちゃんと動作とブレークポイントが一致していました。ここら辺経験値が足りないのでまだ学習途中ですが、問題の特定には実機の方がいいのかもしれません。または、今思うと明示的にcleanしていれば良かったのかも。


ZIPファイルの解凍

参考サイト:iOSでZIPファイルの圧縮/解凍を簡単に実装する方法
アプリ内でZipファイルを解凍したくて、ここを参考にSSZipArchiveを試してみましが、Objective-CでもSwiftでもビルド時にエラーが発生しました。Xcode 6の問題なのか、C言語的な常識を何か理解していないのかわかりません。

2014/8/11追記:SSZipArchiveが、Xcode6+Swiftで使えました。libz.dylibをLink Binary With Librariesに追加する作業が抜けていただけでした。