Swift: # 警告等价物

Swift 有相应的 # 警告吗? 它只是用来在 Xcode 自己的 GUI 中显示一个警告

我还想知道是否有 # error 等价物。

苹果公司表示,# 杂注标记即将到来,这可能是一样的。

enter image description here

47591 次浏览

经过多次的搜寻和渴望,我确信这样的存在是不存在的。我仍然对最新的 Xcode 发布说明抱有希望,它提到了继续缺乏 # 杂注标记机制,# 警告和 # 错误可能也会出现。

顺便说一句,我强烈推荐在 Bugreport.apple.com上向苹果公司提交一个 Radar 来添加这个功能(你可以欺骗17702491)。

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年会前答案

在 Swift 使用 XCode6中,您可以为不同的目的使用 与众不同类型的地标。 苹果公司是这么说的:

Xcode 现在支持//MARK: 、//TODO: 和//FIXME: 地标性建筑进行注释 您的代码并在跳转栏中列出它们。

因此,对于使用描述设置警告,您可以使用如下内容:

//TODO: Clean up this code after testing

如果你只是想设置一个短标记(假设你能记住要做什么) ,使用以下方法:

//FIXME

编辑: 然而,这些地标只出现在 XCode 的跳转条中,这可能不是您所希望的,也不是您所期望的——特别是从//TODO: 和//FIXME 标记中。我用雷达检查过了: # 17776817。希望苹果能够在即将发布的 XCode6版本中添加这个功能。

解决方案(编辑2) : 如果你安装的 Swift Linter 通过家酿(运行 brew install swiftlint后,一个 brew update) ,并添加 建议的构建脚本到您的项目,然后你会看到所有的 TODOFIXME地标出现在 Xcode 作为警告。SwiftLint 甚至会添加一些更多的警告/错误,你可以 配置来满足你的需要-我只能推荐使用 SwiftLint,它很好地解决了这个问题!

作为一种替代方法,如果你想在警告面板中显示一些东西,你可以这样写:

if (false){
var x = 2;
}

您实际上无法显示任何文本,但至少它是一个更可见的标记,特别是如果您倾向于将(大多数)警告视为错误。

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

然而,要在今天的 Xcode 使用 Swift 来激发这个功能,你可以做以下的事情,本 · 多德森和杰弗里 · 桑贝尔斯概述了这些事情:

将一个新的运行脚本添加到目标的构建阶段选项卡(项目设置 > 构建阶段 >’+’> 新的运行脚本阶段) ,并将下面的代码粘贴到空框中:

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

编辑: 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

或者,您可以只使用“发布”而不是“调试”来针对生产构建。

苹果团队还没有添加。我决定这么做可能是作弊,但至少它向我显示了一条 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**")

看看这个 文章

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

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

结果是: enter image description here

我正在使用的一个 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/"

我的回答不是很满意你的问题,但是如果你想要一些简单的东西,你可以使用 恶魔岛这个插件在所有的项目工程没有任何额外的准备。 只要按照下面的步骤做:

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

剪辑

在 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就是一些例子。

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

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

<#todo#>// stop and fixme!

编译时会出现一个“源文件中的编辑器占位符”错误,但与 Jordan 的解决方案不同,在输入:

editor placeholder

我们编写了一个可配置的工具,允许您根据注释标记和构建配置在 Xcode 问题导航器中放置警告和错误: 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/"

这里有一篇文章 描述我们如何使用它。

这个代码片段的优点是——它不显示来自 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

I 提议实施这个功能,它将与 Swift 4.2一起发布。您现在可以通过下载 Swift.org上的 master工具链来使用它。

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

我可能会迟到,因为 Xcode 10支持错误和警告,但是只需要输入一个 String:

"Need to finish implementing this"

将产生一个警告: String literal is unused与自动完成仍然工作,项目仍然编译。