迅速に警告を止める方法


98

多くの警告を生成するコードがあります(廃止予定のAPI)

私ができるclang *を使用して

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

ただし、これは迅速には機能しません。

それを迅速に行う方法は?

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

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



4
これは重複ではありません。他の質問はこの問題に答えることができません。
ClausJørgensen、2015

@ClausJørgensenはどのようにしてこの問題に答えることができませんか?リンクされた質問の回答で述べられているように他の方法はありません。#available開発者が新しいメソッドを使用し、新しいメソッドが利用できない場合は古いメソッドにフォールバックする条件付きコンパイルまたは新しいマクロ。
zrzka

@robertvojtaいいえ、答えは実際に警告を沈黙させる他の方法がないと述べていないので。
ClausJørgensen、2015

2
これはだまされたものではありません。イニシャライザがないために警告が表示される状況はどうですか?
NSTJ 2015

回答:


157

2020年のXcode 12.0の時点では、それを達成する方法はないというコンセンサスがあります。

Appleが機能を追加したら、この回答を更新/編集します。

WWDC 2021のウィッシュリストに入れてください!


20
くそー、それはつまらない。時々手に負えなくなる。控えめに言っても迷惑です。
Isuru

2
私は100万回この回答に反対票を投じたいと思いますが、質問にはかなりよく答えます+1 :-)
デッドビーフ

3
@いするその時点で、私は全体を再構築するのに十分イライラするでしょう。警告が機能したと推測
サイレン

1
@Isuruこれらのほとんどは修正する必要があり、無視しないでください。
ケビン2018

3
とてもイライラ!この回答を更新していただきありがとうございます。
Dan Loewenherz

48

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

廃止予定のメソッド/クラスを使用getLatestImage()するクラスのメソッドがあるとしますFoo

メソッド@availableすべての警告を黙らせるためにダニエル・ソープが説明したように使用します。

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

次に、非推奨の警告なしにメソッドを呼び出しgetLatestImage()ます。最初にプロトコルと拡張機能を定義することで、これを実現できます。

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

次に、非推奨警告なしでメソッドを呼び出します(fooのインスタンスの場合Foo):

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

その結果、廃止予定の警告なしに廃止予定のAPIを使用するSwiftコードができます。


とても賢い。悪の種類?:)しかし、とても良い。廃止予定であるAddressBookフレームワークの一部の側面の継続的な使用に対する警告の抑制などの使用例に最適ですが、実際には必要な機能のすべてがまだ提供されていません。ありがとう。
ダンカンバベッジ2017

4
これで問題がなければ、6パックのお気に入りのドリンクをお送りします。あなたは優れた心の先生を持っています、ありがとう。
ジョン

@ジョン親切な言葉をありがとう!これは機能します。コードベースでは警告をエラーとして扱うため、これを考え出す必要があり、非推奨のライブラリを使用しているセクションが1つあります。
Tammo Freese、2018

1
@ジョンは彼にシックスパックを送りましたか?:Pこれは素晴らしいです。天才。ありがとう。
Baran Emre

あなたは邪悪な天才です。
Krypt

36

実際には、囲んでいる論理構造(つまり、関数/タイプ)で使用することにより、これらの警告抑制することができます@available

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

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

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


6
はい。ただし、addressBookStatus()...を呼び出すと、非推奨としてマークした同じ警告が表示されます。
Valentin Shergin、2015年

3
プロヒント:あなたは、クラス全体のためにそれを黙らしたい場合はちょうどあなたのクラスの声明(例:上のこの子犬をアップスラムclass ViewController: UIViewController
サイレン

2
@Sirens次に、このクラスを呼び出すたびにこの警告が表示されます☹️(少なくともXcode 8を使用)
Alexander Vasenin

誰かがこの修正ですべての廃止された警告を沈黙させることに成功しましたか?それらの数を1つに減らすことができましたが、最後の1つを取り除く方法がわかりません。助言がありますか?
Alexander Vasenin 16年

1
それでは、どのよう警告沈黙するためにこれを使用するのです「『フロート』関係のないタイプに『CGFloat.NativeType』(別名『ダブル』)からキャストは常に失敗し、」私がやっているときif CGFloat(0).native is Float { … }?回答:質問に答えなかったので、これは使用しません。
Slipp D. Thompson 2017

1

現在のところ、Swiftで非推奨の警告を非表示にする方法はありませんが、技術的には、ヘッダーファイルを編集することにより、特定のシンボルに対してそれを行うことができます。

  • 廃止されたシンボル名をコピーします
  • 選択File>Open Quickly
  • 記号を貼り付けて Enter

    [すばやく開く]ボックスでSwiftアイコンが無効になっていることを確認します。

  • 選択File>Show in Finder

  • 必要に応じてファイルのアクセス許可を変更して編集できるようにする
  • シンボルの非推奨マクロを編集します。リファレンスについては、周囲のAPIを参照してください。例えば交換:

__OSX_AVAILABLE_BUT_DEPRECATED(__ MAC_10_6、__MAC_10_10、__IPHONE_3_0、__IPHONE_8_0)

__OSX_AVAILABLE_STARTING(__ MAC_10_6、__IPHONE_3_0)

今、あなたが何もすることができないもう一つの気を散らす警告があります。

汚いよ。ただし、現在のSDKで使用できる代替APIない場合は安全です。Xcodeの新しいバージョンがリリースされると、変更が上書きされ、警告が再び表示されます。次に、新しいSDKとOSをテストして、廃止されたAPIがまだ利用可能であり、代替APIがないことを確認できます。

何か欠点があればコメントしてください。


機知に賛成ですが、口に汚い味が残ります:P
Matt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.