Swift:#warning相当


192

Swiftには#warningに相当するものはありますか?Xcode独自のGUIで警告を表示するために使用されます

#errorに相当するものがあるかどうかにも興味があります。

Appleは#pragmaマークが間もなく登場すると言っていますが、これはおそらくこれと同じになる可能性があります。

ここに画像の説明を入力してください


7
//WARNING#pragmaのようになると思いますが//MARK、現在XCodeベータ版には追加されていません。
Zsolt卿、2014年

1
// WARNING
pixel

@pixel私はレーダーを提出しました
SomeGuy

ジョーダン・スミスの答えを受け入れることができますか?これは#warningとしてSwiftに組み込まれました
Bill

回答:


157

将来、Apple開発者は//WARNING:ランドマークをリリースするか、別の名前のランドマークに機能を提供する可能性があります。

しかし、今日のXcodeのSwiftでこの機能を呼び出すには、Ben DodsonとJeffrey Sambellsが概説しているように、次のことを実行できます。

ターゲットのビルドフェーズタブに新しい実行スクリプトを追加し(プロジェクト設定>ビルドフェーズ> '+'>新しい実行スクリプトフェーズ)、次のコードを空のボックスに貼り付けます。

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

これにより、マークアップしたコメント// TODO:// FIXME:コメントについて、コンパイル時にXcodeに警告のフラグが立てられます。

または、カスタムタグを使用してTAGSを修正することもできます。TAGS="WARNING:"上記のコードでは、TODO&FIXMEのデフォルトの動作を維持し、としてマークアップされたコメントに対してコンパイル時の警告を発し// WARNING:ます。

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- todoコメントからの警告

編集:18/11/14

@ david-hは彼のコメントで良い点を挙げました。特定のビルド構成でこれらの警告のみを発生させたい場合は、以下を実行できます。

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

または、「デバッグ」ではなく「リリース」を使用して、本番ビルドのみをターゲットにすることもできます。


これはAppleが修正するまでの非常に素晴らしい一時的な解決策です:)
SomeGuy

これの問題は、私のアプリに開発と本番の2つのモードがあることです。本番環境では問題なくビルドできることを知りたいのですが、開発中に警告が表示され、基本的に開発モードであることを思い出します-異なるURL、タイムアウト、その他の設定を使用しています。上記のArieの提案により、これを行うことができますすべてにフラグを付けます。とはいえ、この手法には確かに用途があるので、私も賛成票を投じました。
David H

なんて便利なアイデアでしょう!この有用な情報を共有していただきありがとうございます。
トミー

@kyle perl -p -e "s /($ TAGS)/ warning:\ $ 1 /" this line
Rocker

3
うまく機能し-type fますがfind、検索結果からディレクトリを除外するオプションをコマンドに追加する必要がありました。これはほとんどの人にとって問題ではないはずですが、R.swiftポッドを使用する誰もがR.swiftディレクトリなので、私が経験したのと同じエラーに
Dan F

156

編集する

Swift 4.2以降、ビルド警告とエラーの両方で言語レベルのサポートを利用できます。

#warning("Warning description")
#error("Throws a build error")

元の回答

素早い、汚い、そしてとてもエレガントなシンプルさ。

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

「FIX_ME__🛠🛠🛠」が使用されなかったという警告をスローします。

必要に応じて、変数名に絵文字を追加することもできます... reallyと🛠をよく使用します。修正が本当に必要な場合は、forも検討します。あなたは置き換えることができますFIX_ME__:あなたが好きでALGORITHM_NEEDS_REVIEWBugID_148またはJOHNNY_YOU_BROKE_THISいくつかの例があります。

迅速、セットアップ不要、簡潔、顔文字でさえ、コードにユーモア/個性を加えることができます。場合によっては、最も単純なソリューションが最適なソリューションになることがあります。


6
...なぜすべての反対票か。これは、他の方法と同じように機能します。あなたが投票に反対している場合は、少なくとも理由を挙げてください。おそらく私は十分に明確ではなかったか、または私がやっていることに何か問題があります。あるかどうか知りたいです。
ジョーダンスミス

16
ええ、なぜこれ以上賛成されないのか分かりません。他のすべてのソリューションは非常に複雑です。
Simone Manganelli、2016

3
@ZaEeMZaFaRコンパイラはおそらくそれを取り除くでしょう。さらに、ほとんどの場合、これらの問題はリリース前に修正されます。そして、-何らかの理由でコンパイラがそれを取り除くのに十分スマートではない場合でも(これは非常にありそうもないと思います)-メモリ内の100 Int変数は6.4kbのメモリです-基本的には何もありません。有効なポイントはありません。
ジョーダンスミス

4
私は他のものを使用しましたが、これを使用するように切り替えました。:つまり、それは最も簡単だとあなたも、自分自身の警告に表示されます少しメッセージを与えることができlet fixMeMakeMeNonOptional: Intますを与える Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it 問題ナビゲーターに。他のすべてのソリューションでは、はるかに一般的なエラーメッセージが表示されます。
Nathan Perry

1
@NathanPerryええ、同意しました。特にチームや複数のプロジェクトで作業する場合など、複雑なものをセットアップすることは必ずしも選択肢ではありません。さらに、単純なソリューションが常に最善です。私は現在、コメントの横にメッセージを入れていますが、あなたの行動も悪くありません。
ジョーダンスミス

81

WWDC 2018アップデートの投稿

Xcode 10とSwift 4.2以降では、次のように#warning再び使用できるようになります。

#warning("TODO: Clean up this code after testing")

これは期待どおりにXcodeで警告として表示されます。

これは#ifチェックと組み合わせても機能します。たとえば、ターゲットプラットフォームがiOSの場合、以下は警告のみを表示します。

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

#errorビルドを失敗させたい場合もあります。


WWDC 2018以前の回答

XCode 6を使用するSwiftでは、目的に応じてさまざまな種類のランドマークを使用できます。Appleが言ったことは次のとおりです。

Xcodeは// MARK:、// TODO:および// FIXME:ランドマークをサポートするようになり、コードに注釈を付けてジャンプバーにリストします。

したがって、説明付きの警告を設定するには、次のようなものを使用します。

//TODO: Clean up this code after testing

ショートマークを設定したいだけの場合(何をすべきか覚えていると仮定)、これを使用します。

//FIXME

編集: ただし、これらのランドマークは、XCodeのジャンプバーにのみ表示されます。これは、特に// TODO:および// FIXMEマークからは、期待したものでも期待したものでもない可能性があります。私はそれにレーダーを提出しました:#17776817。うまくいけば、AppleはこれをXCode 6の今後のビルドに追加する予定です。

SOLUTION(EDIT 2): あなたが自作経由スウィフトリンターをインストールする場合(実行brew install swiftlintbrew update)と追加提案ビルドスクリプトを、あなたはすべてのあなたが表示されます、あなたのプロジェクトにTODOFIXME目印がXcodeの内の警告として表示されます。SwiftLintは、必要に応じて構成できる警告/エラーをさらに追加します。私はSwiftLintの使用のみを推奨し、この問題を素晴らしい方法で解決します!


7
残念ながら、これらはアプリをコンパイルするときに警告パネルに表示されません。あなたがそれらを忘れないように、痛い親指のように突き出るものをまだ待っています。これらはジャンプバーに表示されるだけなので、プロジェクトを検索して「// TODO」を検索する必要があります。または、誰かがプロジェクト全体でそれらを見る方法を知っている場合は、私に知らせてください。-別のレーダーのための時間:)
SomeGuy

1
ええ、あなたは正しいです。ジャンプバーは左側のサイドバーであり、それらのマークは課題ナビゲーターに表示されると思いましたが、表示されません。私はそれにレーダーを提出しました:#17776817。:)
Jeehut 2014

@SomeGuy彼らがジャンプバーに現れるとはどういう意味ですか?私が見ることができるものから、それらはXcodeのエディタウィンドウの上部にあるバーのどこにもありません。それらに(私にとって)気づく唯一の方法は、Command + Fでそれらを検索することです。ランドマークはどこに表示されますか?
almel

2
@almelジャンプバーはファイルの上部にあるドロップダウンで、現在のファイルの関数のリストを表示しますi.cubeupload.com/jLRwTs.png
SomeGuy

55

まだAppleチームによってまだ追加されていません。私がやろうと決めたのはおそらく不正行為ですが、少なくともFIXMEメッセージは表示されます。だから私がやっていることはSwiftファイルでFIXME()関数を宣言することです:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

他の関数から呼び出すと、警告が表示されます。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

ここに画像の説明を入力してください

Swift 2を使用する場合

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")

2
念のために:@availabilityはSWIFT 2.で「@available」に改名されました
トビアス

42

この記事を見てください

すべてのタグを強調表示する独自のスクリプトを作成できます。

TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"

この結果は次のようになります。 ここに画像の説明を入力してください


Device.swiftのegrep --directories='skip'ような名前のディレクトリを無視して追加
chunkyguy

12

別の方法として、警告パネルに何かを表示したい場合は、次のように書くことができます。

if (false){
   var x = 2;
}

実際にテキストを表示することはできませんが、特に(ほとんど)警告をエラーのように扱う傾向がある場合は、少なくともより目立つマーカーになります。


11
または、偽の場合は「{警告メッセージ "}
Bao Lei

このソリューションはひどいです。しかし、利用可能な最高のようです。投票、ありがとう。
skagedal 2017


5

私が使用してい.swiftた1つのCocoaPodがその名前に含まれていたため、ディレクトリが返され、カイルのスクリプトがクラッシュしました。コマンドに追加-type fすると、パターンに一致するディレクトリを返すのfindでは*.swiftなく、一致するファイルのみを調べることで問題が修正されます。

私が使用した最終的なコード:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

1
コンパイラに文句を言わせない方法はありますか?「コマンド/ bin / shでエラーが発生しましたが、失敗を示すゼロ以外の終了コードが返されませんでした」
Chris Paveglio

別の方法として、上記の
chunkyguy 2017

4

ビルド設定を調整したくない場合は、コメントの前にエディターのプレースホルダーを貼り付けると、簡単なホームレメディになります。

<#todo#>// stop and fixme!

ビルド時に「ソースファイルのエディタープレースホルダー」エラーが表示されますが、ジョーダンのソリューションとは異なり、入力中に煩わしいライブエラーはありません。

エディターのプレースホルダー


いい考えですが、エラーではなく警告をスローするという考えではありませんか?これを行うと、それを削除するまでビルドできません。多くの場合(ほとんどの場合)、これは間違いなく必要なことではありません。TodoとFixmeマークには、数週間の作業が含まれることがあります。この期間にプロジェクトをビルドして実行したいと思うでしょう:)
Jordan Smith

確かに、それは良い点です。このアプローチは、アプリケーションをコミットまたは実行する前に実行する必要がある、より緊急のタスクの場合にのみ役立ちます。主な利点は、このプレースホルダーが存在しても、構文の強調表示やその他のエディターの機能が引き続き機能することです。ここでは他にもいくつかのアプローチを使用していますが、プレースホルダはマルチタスクを行うときに役立つ場合があります。これは、関数呼び出しのオートコンプリート時にXcodeが挿入するプレースホルダーと同じ使用例に適合します。
MinhNguyễn2016年

3

多くの調査とあこがれの後、私はそのような実体は存在しないと確信しています。#pragma markメカニズムの継続的な欠如について言及している最新のXcodeリリースノートにはまだ期待しています。#warningおよび#errorも同様に来る可能性があります。

余談ですが、bugreport.apple.comでAppleにレーダーを提出してこの機能を追加することを強くお勧めします(17702491をだますことができます)。


1
私は自分の役割を果たしました:rdar:// 19005171
David H

1
レーダーにも記入
HixField 2015年

2

コメントタグとビルド構成に基づいてXcode Issue Navigatorに警告とエラーを配置できる構成可能なツールを作成しました:https : //github.com/doubleencore/XcodeIssueGenerator

インストールしてください:

brew tap doubleencore/tap
brew install xcodeissuegenerator

次に、スクリプトの実行ビルドフェーズに行を追加します。

# Mark WARNINGs, SERIOUSs, and TODOs as warnings in DEBUG builds excluding the Vendor and Third Party directories.
XcodeIssueGenerator -b DEBUG -w "WARNING, SERIOUS, TODO" -x "Vendor/, Third Party/"

ここでは、その使用方法を説明する記事を示します。


2

エラーと警告をサポートするXcode 10でパーティーに遅れる可能性がありますが、単に文字列を入力します。

"Need to finish implementing this"

警告が表示されます:String literal is unusedオートコンプリートは引き続き機能し、プロジェクトはまだコンパイルされています。


1

私の答えはあなたの質問を完全に満足させるものではありませんが、何か簡単なものが必要な場合は、追加の準備なしですべてのプロジェクトで機能するアルカトラズのこのプラグインを使用できます。次のようにしてください:

1) install Alcatraz (Nice package manager for Xcode Plug-ins) by entering this line in terminal: 
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2) Then restart Xcode and on it launch agree to install all bundles not included in Xcode
3) In Xcode select menu item -> Window -> Package manager -> type in search panel XTodo and press install
4) Relaunch Xcode and again agree to install additional bundles
5) From now press Ctrl + T and you will see all Tags in nice window

新しいタグを追加するための設定もあります

ここに画像の説明を入力してください


1

このスニペットの利点-ポッドからの警告は表示されません。

if [ "${CONFIGURATION}" = "DEBUG" ]; then 
    TAGS="TODO:|FIXME:|WARNING:|warning:" find "." \( -name "*.swift" \) -not -path "./Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

インストールする方法:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.