OCとSwiftの混成プロジェクトはSwift 4に移行する.2小記

5514 ワード

前言Xcode10の正式版が発表されてから、カニを先に食べた友达はDark Modeの驚きを称賛し、同時にAPPStroeにパッケージアップロードした後、オンラインのiOS9.3設備の大面積crashの記録を監視し、最後にXcode10の問題であることが確認されたと報告した.
そのため、私はずっとXcode9.4.1Swift4を使って混編プロジェクトの開発を行っています.
しかし、低バージョンのXcodeパッケージを使用してAPPStoreをアップロードするたびに、アップルの公式警告メールが届きます.
メールの内容が示すように、2019年の3月までに低バージョンのXcodeを使用してパッケージアップロード操作を行うことはできない.
そこで、私は移転の道を始めるしかなかった.
移行の開始
現在のXcode10.1(10B61)で開く後、Build SettingSwift Language Versionを検索し、対応する値をSwift 4.2に変更してコンパイルを開始すると、非常に多くのError、多くはABIの変動が発生し、ヒントに従って修正すればよい.
AVAudioSessionの変更
しかし、1つの例外がある:SwiftによってAVAudioSession setCategoryという方法が使用する場合、Swiftにおいて方法が使用できないことが知られる.ジャンプしてAPIが変わったことに気づきました
/* set session category and mode with options */
    @available(iOS 10.0, *)
    open func setCategory(_ category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions = []) throws

低バージョンと互換性を持つために、OCを使用してAVAudioSessionの分類をブリッジするのが適切です.
// AVAudioSession+Swift.h:

@import AVFoundation;

NS_ASSUME_NONNULL_BEGIN

@interface AVAudioSession (Swift)

- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:));
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:options:));

@end

NS_ASSUME_NONNULL_END

// AVAudioSession+Swift.m:

#import "AVAudioSession+Swift.h"

@implementation AVAudioSession (Swift)

- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError {
    return [self setCategory:category error:outError];
}
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError {
    return [self setCategory:category withOptions:options error:outError];
}

@end

そしてあなたのプロジェクトの-Bridging-Header.hの中でimportという分類です.
#import "AVAudioSession+Swift.h"

そして前のように呼び出すことができます.
try AVAudioSession.sharedInstance().setCategory(.playback)

While deserializing SIL vtable for 'Class' in module 'module' error: Abort trap: 6
このような問題は2つに分けられ、1つはmoduleが他のtarget、例えばPodsの中で、もう1つはmoduleが自分で作成したtargetである.
第1種
1つ目はErrorが指す3つのライブラリを最新バージョンに更新するだけでいいです.Xcode10は半年近く発表されています.これらの問題は前にもありました.半年の間、基本的に流行している3つのライブラリはSwift4.2に適しています.
第2種
2つ目は、一般的にErrorのうちClassが指すクラスであり、自分はSwiftクラスであるが、Objective-Cが宣言したクラスから継承する.私は自分でいくつかの微調整を試した後、何の役にも立たないことに気づいたので、間違いのクラスをObjective-Cで書き直し、ブリッジファイルに導入するしかなかった.幸い、間違いを報告するのは多くなく、あまり力を入れなかった.
他の奇妙な間違い
移転が完了した後、プロジェクトが走り出すと、奇妙な問題がたくさん発生します.たとえば、メソッドAが呼び出されるとunrecognize selector *と、(setupNavibar関数では初期化コンストラクタを呼び出す必要はありません)という名前の が報告されます.
このような誤りは、一般的に以上の2つの問題と本質的であり、自分でよく区別し、それから相応の更新/変更をすればよい.
以上の問題を除く、プロジェクトコンパイル時にはPodsで引用された第三者のクラスにABIが修正する必要があるErrorを報告するが、この場合は隊形のTargetを見つけるだけで、そのBuild SettingsSwift Language Versionをその対応バージョンに修正すればよい.
最后に、将来Swift 5に适する时、こんなに多くの穴がないことを望みます...