はじめに
3年くらい放置していたアプリのメンテナンスが必要になり、ビルドをしたらぜんぜんダメだったのですが、解決方法を記録しておきます。
主にダメだったのは以下の点です
- Swiftのバージョン
- UITableView
- UICollectionView
開発環境
- 対応前 Xcode9
- 対応後 Xcode11.5
対応内容
SWIFT_VERSIONエラー
エラ〜メッセージ
SWIFT_VERSION '3.0' is unsupported, supported versions are: 4.0, 4.2, 5.0.
もともとSwift3.0で書かれていたのですが、Xcode11ではすでにSwiftのバージョンは5.0になっています。しかしバージョン2つ飛ばしは心配なので、4.0を選択しました。
幸いにもSwift3.0から4.0の差分はそれほどないので、バージョンの変更だけですみました。
Build SettingsのSwift Language Versionを4.0に変更しました。
変更前
変更後
同様に、Podfileにもバージョン指定があったので、削除しました
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
end
end
end
UITableViewやUICollectionViewのDelegateが変更されていた
次に発生したのは以下のエラー
[xxxx.StoryViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x7fc48663aa50
[xxxx.StoryViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x7fc48663aa50'
UITabeViewDelegateとUITableViewDatasourceのメソッド名が変更されていました。
StoryBoardでDelegateをつなげるとProtocolを書かなくても問題なく動作していたのですが、代わりにコンパイル時にエラーチェックされないので、ちゃんとプロトコルを定義するように変更しました。
Protocolを追加しておけばXcodeの機能で自動的に変換できます。
修正前
class StoryViewController: UIViewController {
:
修正後
class StoryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
:
Protocolを設定すると、以下のようにエラーメッセージが表示され、Fixボタンを押すと自動的に変換されます。
最後に
分かってしまえば大したことのない修正項目ですが、これだけでも数時間費やしてしまいました。同じことにハマる人も多いと思いますので、(そんなにいないかな)念のため共有しておきます。
SwiftやiOS SDKは毎年変化があり、毎年メンテナンスしていればこのような問題はそれほど起きないのですが、バージョンを飛ばすと途端に対応が大変になったりしますね。