web-dev-qa-db-ja.com

swiftで警告を黙らせる方法

私は多くの警告を生成しているコードを持っています(廃止されたAPI)

Clang *を使用すると

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

ただし、これはSwiftでは機能しません。

Swift?

注:警告をグローバルに無効にしたり、ファイル全体で無効にしたりするのではなく、ソースコードの特定の部分で特定の警告を無効にします。

編集:私のメモは十分に明確ではなかったようです:条件付きコンパイル(これは想定される重複の提案された答えです)を望んでいません。新しいAPIを使用せずに警告を黙らせたいだけです。

79
Antzi

2018年のXcode 10.0では、コンセンサスはそれを達成する方法がないということです。

Apple機能を追加する場合、この回答を更新/編集します。

WWDC 2019のウィッシュリストに追加してください!

121
Antzi

実際、can囲んでいる論理構造(関数/型など)で@availableを使用することで、これらの警告を抑制します。

たとえば、AddressBookフレームワークを使用するコードがあるが、iOS 9に対してビルドしているとします。

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

Xcode 7.0.1以降、これによりインライン警告が表示されなくなります。

36
Daniel Thorpe

Swiftには非推奨の警告を黙らせる一般的な構造はありませんが、多くの場合に適用できる回避策があります

非推奨のメソッド/クラスを使用するクラスFooにメソッドgetLatestImage()があるとしましょう。

Daniel Thorpeが説明したように_@available_を使用して、すべての警告を黙らせますinsideメソッド:

_@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}
_

今、あなたはcallメソッドgetLatestImage()を非推奨の警告なしにしたいと思います。最初にプロトコルと拡張機能を定義することでそれを実現できます。

_private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}
_

そして、非推奨の警告なしでメソッドを呼び出します(fooFooのインスタンスである場合):

_(foo as GetLatestImage).getLatestImage() // no deprecation warning
_

その結果、非推奨の警告なしで非推奨のAPIを使用するSwiftコードがあります。

32
Tammo Freese