入門 - swift 言語




Swift:#ワーニング同等物 (10)

スウィフトには#ワーニング相当品がありますか? Xcode独自のGUIに警告を表示するために使用されます

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

Appleは#pragmaマークがすぐに来ていると言っているが、これはおそらくこれと同じである可能性がある。


ポスト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もあります。

Pre WWDC 2018 Answer

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

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

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

//TODO: Clean up this code after testing

短いマークを設定したいだけなら(これを覚えていると仮定して)、これを使用してください:

//FIXME

編集:これらのランドマークはXCodeのジャンプバーにのみ表示されます。これはあなたが望むものではないかもしれません。特に// TODO:と// FIXMEのマークです。 私はそれにレーダーをかけました:#17776817。 うまくいけば、アップルはXCode 6の今後のビルドでこれを追加する予定です。

ソリューション(2): Swift LinterをHomebrew経由でbrew install swiftlint後にbrew install swiftlint実行brew update、提案されたビルドスクリプトをプロジェクトに追加するとすべてのTODOおよびFIXMEランドマークがXcode内に警告として表示されます。 SwiftLintは、あなたのニーズに合わせてconfigureできるいくつかの警告/エラーを追加します - 私はSwiftLintの使用を推奨することができ、この問題をすばらしい方法で解決します!


Appleのチームによってまだ追加されていません。 私が決心したことはおそらく不正行為ですが、少なくともそれは私にFIXMEメッセージを表示します。 だから私はスウィフトファイルで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**")

このarticle見てarticle

すべてのタグを強調表示する独自のスクリプトを書くことができます。

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/"

これは次のようになります。


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

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

インストールする方法:


使用していた.swiftには名前に.swift.swiftれていたので、ディレクトリが返され、Kyleのスクリプトがクラッシュしました。 findコマンドに-type fを追加すると、そのパターンに一致するディレクトリを返す代わりに、 *.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/"

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

if (false){
   var x = 2;
}

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


将来、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-warnings-from-todo-comments

編集: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

あるいは、「デバッグ」ではなく「リリース」を使用して、プロダクションビルドのみをターゲットにすることもできます。


proposedこの機能をproposedimplemented 。それはSwift 4.2で出荷されます。 swift.org masterツールチェーンをダウンロードすることで今すぐ使用できます。

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")

私の答えはあなたの質問をかなり満足させるものではありませんが、何か簡単にしたい場合は、追加の準備なしにすべてのプロジェクトで動作するalcatrazの thisプラグインを使用できます。 次のようにしてください:

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

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


私はXcode 10でエラーや警告をサポートするのに遅れているかもしれませんが、単にStringを置くだけです:

"Need to finish implementing this"

String literal is unused 、オートコンプリートがまだ機能しており、プロジェクトはまだコンパイルされています。





swift