Swift:#警告等效


192

Swift是否具有#warning等效项?它只是用来在Xcode自己的GUI中显示警告

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

苹果已经表示即将推出#pragma标记,可能与此相同。

在此处输入图片说明


7
我认为它//WARNING就像#pragma一样,//MARK但是当前它们都未添加到XCode beta中。
Zsolt勋爵2014年

1
我强烈建议您提交雷达请求//警告
像素像素

@pixel我刚刚提交了雷达
SomeGuy 2014年

你能接受乔丹·史密斯的回答吗?这是现在内置斯威夫特#warning后
比尔

Answers:


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

这将强制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-待办事项警告

编辑:14/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 2014年

问题是我的应用程序有两种模式-开发和生产。我想知道它在生产中是干净的,但是我在开发中收到一条警告,从本质上提醒我处于开发模式-使用不同的URL,超时,其他设置等。标记所有内容。就是说,这项技术肯定有用,所以我也投了赞成票!
David H

多么有用的主意!感谢您分享这些有用的信息。
Tommy

@kyle您能否让我知道perl -p -e“ s /($ TAGS)/警告:\ $ 1 /”的意思,这行
Rocker

3
效果很好,但是我必须-type ffind命令中添加选项以从查找结果中排除目录。对于大多数人来说,这应该不是问题,但是使用R.swiftPod的任何人都会遇到与我相同的错误,因为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__🛠🛠🛠”。

如果愿意,可以在表情符号名称中添加表情符号。我经常使用😱和🛠,对于某些确实需要修复的问题,我什至会考虑使用💩。您可以替换FIX_ME__使用任何你想要的:ALGORITHM_NEEDS_REVIEWBugID_148或者JOHNNY_YOU_BROKE_THIS是一些例子。

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


6
...为什么所有的否决票?这和这里的任何其他方法一样有效。如果您不赞成投票,至少要提供一个理由,也许我不够清楚,或者我的工作有问题。我想知道是否有。
乔丹·史密斯

16
是的,我不确定为什么没有更多的支持。所有其他解决方案都太复杂了。
Simone Manganelli,

3
@ZaEeMZaFaR编译器很可能会摆脱它。此外,在大多数情况下,这些问题将在发布前得到解决。而且-即使出于某种原因,编译器也不够聪明,无法摆脱它(我认为这不太可能)-内存中的100个Int vars是6.4kb的内存-基本上没有。对不起,我认为您的观点没有道理。
乔丹·史密斯

4
我使用了其他的,但改用了这个。这是最简单的方法,您甚至可以给自己一些提示,该提示将显示在警告中,即: 在问题导航器中let fixMeMakeMeNonOptional: Int为您提供信息 Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it。所有其他解决方案都为您提供了更多的通用错误消息。
内森·佩里

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中,您可以使用 不同类型的界标用于不同的目的。这是苹果对此的评价:

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

因此,为了设置带有说明的警告,您将使用以下内容:

//TODO: Clean up this code after testing

如果您只想设置一个短标记(假设您会记住该怎么做),请使用以下方法:

//FIXME

编辑: 但是,这些界标仅出现在XCode的跳转栏中,这可能不是您想要的以及期望的-特别是从// TODO:和// FIXME标记中。我已经对此提出了要求:#17776817。希望苹果公司可以在XCode 6的后续版本中添加它。

解决方案(编辑2): 如果通过Homebrew安装Swift Linter(在brew install swiftlint之后运行brew update)并将建议的构建脚本添加到项目中,那么您将在Xcode中看到所有TODOFIXME地标作为警告出现。SwiftLint甚至还会添加一些其他警告/错误,您可以根据自己的需要进行配置 -我只能建议使用SwiftLint,它可以很好地解决此问题!


7
不幸的是,当您编译应用程序时,这些内容不会显示在警告面板中。我仍在等待一个像大拇指一样伸出来的手指,这样您就不会忘记它们了。这些仅显示在跳转栏中,您需要记住在项目中搜索“ // TODO”才能找到它。或者,如果有人知道如何在整个项目中看到它们,请告诉我。-换另一只雷达的时间:)
SomeGuy 2014年

1
恩,是的。我以为跳转栏是左侧的侧栏,并且这些标记会出现在“问题导航器”上,但不会出现。我刚刚对此提交了雷达:#17776817。:)
Jeehut 2014年

@SomeGuy,这是什么意思,因为它们显示在跳转栏中?从我看到的内容来看,它们不在Xcode编辑器窗口顶部的栏上。注意到它们的唯一方法(对我而言)似乎是使用Command + F搜索它们。显示的地标在哪里?
almel 2014年

2
@almel跳转栏是文件顶部的下拉列表,它提供了当前文件中的功能列表i.cubeupload.com/jLRwTs.png
SomeGuy 2014年

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
}

在此处输入图片说明

对于Swift 2使用

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

2
仅作记录:@availability已在快速2中重命名为“ @available”。–
Tobias

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

结果是: 在此处输入图片说明


添加egrep --directories='skip'以忽略诸如Device.swift之
chunkyguy

12

或者,如果您希望在警告面板中显示某些内容,则可以编写以下内容:

if (false){
   var x = 2;
}

您实际上并不能显示任何文本,但是至少它是一个更可见的标记,尤其是当您倾向于将(大多数)警告视为错误时。


11
或者,如果错误的{“警告消息”},那么做
鲍磊

这个解决方案是可怕的。但似乎是最好的。投票,谢谢。
skagedal's


5

我正在使用的一个CocoaPod .swift以其名称命名,因此返回了一个目录,这导致Kyle的脚本崩溃。通过仅查看匹配的文件而不是返回与模式匹配的目录,-type ffind命令添加到命令中即可解决该问题*.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

4

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

<#todo#>// stop and fixme!

生成时会出现“源文件中的编辑器占位符”错误,但是与Jordan的解决方案不同,在键入时没有烦人的烦人行为:

编辑器占位符


好主意-但不是发出警告而不是错误的主意吗?这样做直到您将其删除才可以进行构建,在很多(大多数情况下)情况下,这绝对不是您想要的。Todo和fixme标记有时涉及数周的工作-我想您会在这段时间内构建并运行您的项目:)
Jordan Smith

当然,这是一个好点。这种方法仅对提交或什至运行应用程序之前必须执行的更紧急的事项有用。主要好处是,尽管存在此占位符,但语法高亮显示和其他编辑器细腻之处仍继续起作用。我本人也使用了其他方法,包括您自己的方法,但是在执行多任务处理时,占位符有时会很有用。自动完成功能调用时,它适合与Xcode插入的占位符相同的用例。
MinhNguyễn16年

3

经过大量的搜索和渴望,我确信不存在这样的实体。我仍然对最新的Xcode发行说明充满希望,因为它提到仍然缺乏#pragma标记机制,因此#warning和#error也可能会出现。

顺便说一句,我强烈建议您在bugreport.apple.com上向Apple提交Radar 以添加此功能(您可以复制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迟到了,但只需输入一个String:

"Need to finish implementing this"

会产生警告:String literal is unused自动补全功能仍在运行,项目仍在编译中。


1

我的回答不能完全满足您的问题,但是如果您想轻松一点,可以使用alcatraz的插件,插件可在所有项目中使用,而无需进行任何额外的准备。只需执行以下操作:

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

此代码段的优势-它不会显示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

如何安装:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.