読者です 読者をやめる 読者になる 読者になる

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

Eclipse使いのJavaプロラマが、Xcode+SwiftiPhoneアプリを作ってみるの2週目です。(1週目は、http://d.hatena.ne.jp/grachro/20140713)。アプリ内容はまだ書けません。

Xcode 6 beta3

  • エディタの動作が重くなってきた。一文字打つごとに数分固まる。タイミング的に、beta2からbeta3に変えた頃が怪しい気がするがさだかではない。
  • http://blog.valeur3.com/?p=1515 ここを参考にキャッシュを捨てたら固まらなくなった

iPod touch (第5世代)

  • ios 8 の実機動作確認にはiPod touchを使用。こちらもbeta3に変えて、アプリの起動までの時間が長くなった気がする。
    • 前はシミュレータで動作させるより実機の方が起動が早かったが、今やシミュレータのほうがで早い。(?)
  • 何かの弾みでiOS8 beta3を入れたiPod toucheが真っ暗なまま何をしても動かなくなった。iTunesからOS再インストールで直った
  • なぜかシミュレータで動くコードが、iPod touchだと動かない。
    • シミュレータで動く「ObjCBool(false)」が、iPod touchだと「ObjCBool(0)」こう

Swift

  • Javaの「if (aObject instanceof String) {..}」は、Swiftだと「if aObject is String {..}」

Core Data

シリアライズ

  • プリミティブなフィールドだと自動的にシリアライズさるるJavaと違い、Xcodeだとフィールドを一つ一つコード上で設定する必要がある。
  • NSKeyedArchiver.archiveRootObject(オブジェクト, ファイルパス)とNSKeyedUnarchiver.unarchiveObjectWithFile(ファイルパス) as? クラスで直接ファイルに保存・読み込みできるので、永続化は楽。
  • テーブル1レコード毎に1ファイルをシリアライズ保存だと相応の処理時間がかかったので、Dictionaryにまとめて1度に保存すると改善した。
    • ちゃんと計測していないが、ファイル操作周りで時間がかかるのだと思う
  • Core Dataを使用していた時より、構造の修正が簡単になり、DAOクラスの見通しもよくなった。
    • トレードオフとしてwhereやorder byを自分で実装しないといけない。

Dictionaryのシリアライズ

  • SwiftでNSDictionaryクラスをシリアライズしようとすると、countが無いとかでエラーとなる。overrideが間違っている?
  • NSが付いていないDictionaryクラスを素直に使えば簡単にシリアライズできた。しかもこちらだとタイプセーフ。
  • Dicionaryのタイプを指定したサブクラスを作りたかったが、文法的にどうすればいいのかわからなかかった。一旦aliasで逃げたがこれだとサブクラスにメソッドが追加できない。
    • Javaの「class Foo extends HashMap {...}」がしたくて
    • Swiftで「typealias Foo = Dictionary」こうしてみた
  • "Swiftで辞書型のストアド・プロパティへのアクセスは遅い?"http://qiita.com/takabosoft/items/b2dd95d6c1cbe651fba4 ・・・このサイトと同じ現象に遭遇。
    • 解決方法もリンク先にある通り、ローカル変数で処理して最後にプロパティ代入で逃げれた。

サーバとのデータ同期

  • サーバtoスマホでのデータ同期で、サーバtoサーバのデータ同期と違う点
    • 粒度は小さくする
    • 失敗する可能性が高い、途中からでもリカバリできるように
    • いつ処理されるかわからない
    • 接続される端末数が不定

その他

  • サーバサイドはJava、クライアントサイドはSwiftでコード書いていると、10年もだいたい毎日書いているJavaの文法を間違うことがある。