斯威夫特:#warning当量

时间:2014-06-12 11:58:28

标签: swift

Swift有#warning等价物吗? 它只是用于在Xcode自己的GUI中显示警告

我也对是否存在#error等价物感兴趣。

Apple已经表示#pragma mark即将推出,可能与此相同。

enter image description here

14 个答案:

答案 0 :(得分:154)

将来,Apple开发者可能会很好地发布//WARNING:地标,或者为另一个命名的地标提供功能。

如今要在Xcode中使用Swift来启用此功能,您可以按照Ben Dodson& Sons所述的方式执行以下操作。 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/"

这会强制Xcode在编译时为您标记的任何// TODO:// FIXME:注释发出警告。

或者,您可以使用自定义标记修改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

编辑:2014年11月18日

@ 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

或者,您可以使用“Release”而不是“Debug”来仅定位生产构建。

答案 1 :(得分:135)

修改

从Swift 4.2开始,语言级支持可用于构建警告和错误。

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

原始答案

快速,肮脏,同时优雅简单哦。

// Description of what you need to fix

var FIX_ME__: AnyObject

发出警告' FIX_ME __'从未使用过。

如果您愿意,可以将表情符号添加到变量名称...我经常使用,对于真正需要修复的东西我甚至会考虑。您可以将FIX_ME__替换为您想要的任何内容:ALGORITHM_NEEDS_REVIEWBugID_148JOHNNY_YOU_BROKE_THIS是一些示例。

快速,没有设置,简洁和表情符号甚至可以为您的代码添加幽默/个性。有时最简单的解决方案是最佳解决方案。

答案 2 :(得分:74)

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答案

在使用XCode 6的Swift中,您可以将不同的种类的地标用于不同的目的。 这就是Apple所说的:

  

Xcode现在支持// MARK:,// TODO:和// FIXME:地标来注释   你的代码并在跳转栏中列出它们。

因此,要设置带描述的警告,您可以使用以下内容:

//TODO: Clean up this code after testing

如果您只想设置一个短标记(假设您将记住该做什么),请使用:

//FIXME

修改 然而,这些地标只出现在XCode的跳转栏中,这可能不是你想要的和人们期望的 - 特别是来自// TODO:和// FIXME标记。我已经提出了一个雷达:#17776817。希望Apple能在XCode 6即将推出的版本中添加它。

解决方案(编辑2): 如果您通过Homebrew安装Swift Linter(在brew install swiftlint之后运行brew update)并将the suggested build script添加到您的项目中,那么您将看到所有TODO和{{1} }地标在Xcode中显示为警告。 SwiftLint甚至会添加一些警告/错误,你可以configure来满足你的需求 - 我只能推荐使用SwiftLint,它可以很好地解决这个问题!

答案 3 :(得分:55)

苹果团队尚未添加。我决定做的可能是作弊,但至少它确实向我展示了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
}

enter image description here

对于Swift 2使用

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

答案 4 :(得分:42)

看看这个article

您可以编写自己的脚本,以突出显示所有标记。

{{1}}

结果是: enter image description here

答案 5 :(得分:12)

作为替代方案,如果您希望在警告面板中显示某些内容,您可以编写如下内容:

if (false){
   var x = 2;
}

您无法真正显示任何文字,但至少它是一个更明显的标记,特别是如果您倾向于处理(大多数)错误等警告。

答案 6 :(得分:5)

我使用的一个CocoaPod名称中包含.swift,因此返回了一个目录,导致Kyle的脚本崩溃。将-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/"

答案 7 :(得分:5)

proposedimplemented此功能,它将随Swift 4.2一起提供。您现在可以通过swift.org下载master工具链来使用它。

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

答案 8 :(得分:4)

如果你不愿意调整你的构建设置,另一个简单的家庭补救措施就是在评论面前贴一个编辑器占位符:

<#todo#>// stop and fixme!

您在构建时遇到“源文件中的编辑器占位符”错误,但与Jordan的解决方案不同,键入时不会有任何实际错误来惹恼您:

editor placeholder

答案 9 :(得分:3)

经过多次寻找和渴望,我确信没有这样的实体存在。我仍然希望最新的Xcode发行说明提到持续缺乏#pragma标记机制,#warning和#error也可能会出现。

顺便说一句,我强烈建议在bugreport.apple.com向Apple提交Radar以添加此功能(您可以使用17702491)。

答案 10 :(得分: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/"

Here's an article描述了我们如何使用它。

答案 11 :(得分:1)

我的回答并不能完全满足您的问题,但如果您想要轻松的话,可以使用thisalcatraz插件,该插件适用于所有项目而无需任何其他准备工作。 只需执行以下操作:

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

它还有添加新标签的首选项

enter image description here

答案 12 :(得分:1)

此代码段的优点 - 它不会显示来自Pods的警告:

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

如何安装:

enter image description here

答案 13 :(得分:0)

我可能会晚点参加Xcode 10支持错误和警告的聚会,但只需输入一个字符串:

"Need to finish implementing this"

会产生警告:String literal is unused仍会自动完成,并且项目仍在编译。