post Image
個人開発アプリでSwift 4に一足先に対応しました

個人開発アプリで一足先にSwift 4に対応しました。
対応の記録を記事にしました。

どんなアプリか

カラオケレコーダー+というアプリです。

2017年のゴールデンウィーク明けごろにリリースしたアプリで、Swift 3.1で開発しました。

https://itunes.apple.com/jp/app/karaokerecorder/id1233303739?l=en&mt=8
からダウンロードすることができます。

ソースコードをGithubで公開しています。

アプリの機能

  • 基本的な機能は録音です。
  • 録音したデータにアーティスト名や曲名といったプロパティを設定しておくことができることが他の録音アプリとの違いです。しかもそれらのプロパティでデータを並べ替えして後から見返すことも可能です!
  • ひとりカラオケで練習する人が録音に使うといった状況を想定したアプリです(超ニッチ!)。

対応内容

注意: 以下の内容は全てベータ版のソフトウェアで試したものです。
注意: 以下の内容は全てオープンソースになっているSwift 4について、あるいは、Appleが一般に公開している情報に関するものです。

以下、Swift 4対応のためにしたことです。
変更内容は、swift4というブランチにプッシュしてあります。

外部ライブラリ

このアプリでは、

  • Google Analytics
  • RealmSwift

を使っています。

Google Analytics

Google Analyticsは特に設定を変更せずにそのまま使えました!おそらくObjective-Cでビルドしてあるのだと思います。

RealmSwift

既報の通り、Swift 4でのABI安定化は見送られたのでSwift 4でビルドしたRealmSwiftを用意する必要がありました。

ただこれも難しいことはなく、Cartfileにgithub "realm/realm-cocoa" "master"
と書いてcarthage updateしてやればRealmSwiftをSwift 4でビルドすることができます。

RealmSwiftをSwift 4でビルドする際の注意点として、コマンドラインでSwift 4を使うように設定しないといけません(そうしないとSwift 3.1を使ってビルドしてしまいます)。
そのためには、Xcode 8.3.3だとPreferences -> Locations -> Command Line Toolsで設定を変えればOKです(Xcode 9ではどうなのかということはNDA違反を避けるために言及しません)。

修正が必要だったコード

以下、修正が必要だったコードです。

その1

Error1
class Track: Object {
    // その他のプロパティやメソッドなど
    dynamic var songTitle: String?
    // ...
}

修正したコードが以下です

Error1Fixed
class Track: Object {
    // その他のプロパティやメソッドなど
    @objc dynamic var songTitle: String? // @objcを追加
    // ...
}

TrackというクラスはRealmのモデルクラスです。ドキュメントにある通りRealmのモデルクラスのプロパティには、dymanicという属性をつける必要があります。
Swift 3.1ではdynamicだけで@objcも同時に指定する効果がありました。しかし、Swift 4ではそうではないようです。

その2

Error2
let attribute = [
    NSFontAttributeName: UIFont(name: fontName, size: 60)!,
    NSKernAttributeName: NSNumber(value: 8.0)
]

修正したコードが以下です

Error2Fixed
let attribute = [
    NSAttributedStringKey.font: UIFont(name: fontName, size: 60)!,
    NSAttributedStringKey.kern: NSNumber(value: 8.0)
]

NSAttributedStringKeyという構造体がいつの間にか追加されています。
それを使えばOKでした。

その3

Error3
present(navigationController, animated: true, completion: {_ in
    self.resetInterfase()
})

修正したコードが以下です

Error3Fixed
present(navigationController, animated: true, completion: { // _ in を消去
    self.resetInterfase()
})

Swift 3.1では、クロージャ式で引数を使わない場合、_ inと、引数を使わないことを明示的に書く必要がありましたがSwift 4ではエラーになるようです。
クロージャ式の引数の仕様変更のドキュメントが見つからず、この対応方法が正しいのか分からないです(もしかしたらコンパイラのバグ?)。

案外すんなり終わった

以上の修正でビルドできました!軽く触ったところ問題なく動作しています。

Swift 4には破壊的変更はないという話でしたが本当でしたね。

@mono0926 さんにコメントでフィードバックいただきました!🙇

いただいたコメントの通りSwift 3.1ではコンパイルできていたコードがSwift 4でコンパイルできなくなったので、これは破壊的変更だと言えます。
僕の個人開発アプリの場合はすんなり終わりましたが、比較的小規模なアプリであったことにご注意ください。アプリの規模や設計によってはSwift 4対応にある程度の工数がかかる可能性があります。

ただ、Swift 4での破壊的変更はSwift 3対応と比べて少なく、したがって、対応も格段に楽であることは言えるのではないでしょうか。


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。