Swift是否具有#warning等效项?它只是用来在Xcode自己的GUI中显示警告
我也对是否存在#error等效感兴趣。
苹果已经表示即将推出#pragma标记,可能与此相同。
Swift是否具有#warning等效项?它只是用来在Xcode自己的GUI中显示警告
我也对是否存在#error等效感兴趣。
苹果已经表示即将推出#pragma标记,可能与此相同。
Answers:
将来,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
或者,您可以使用“发布”而不是“调试”来仅定位生产版本。
-type f
在find
命令中添加选项以从查找结果中排除目录。对于大多数人来说,这应该不是问题,但是使用R.swift
Pod的任何人都会遇到与我相同的错误,因为R.swift
它是目录
编辑
从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_REVIEW
,BugID_148
或者JOHNNY_YOU_BROKE_THIS
是一些例子。
快速,无需设置,简洁和表情符号甚至可以在代码中添加幽默感/个性。有时,最简单的解决方案是最好的解决方案。
let fixMeMakeMeNonOptional: Int
为您提供信息 Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it
。所有其他解决方案都为您提供了更多的通用错误消息。
从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
,如果你想你的构建失败。
在使用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中看到所有TODO
和FIXME
地标作为警告出现。SwiftLint甚至还会添加一些其他警告/错误,您可以根据自己的需要进行配置 -我只能建议使用SwiftLint,它可以很好地解决此问题!
苹果团队尚未添加。我决定要做的可能是作弊,但至少它确实向我显示了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**")
看这篇文章。
您可以编写自己的脚本,该脚本将突出显示所有标签。
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之
或者,如果您希望在警告面板中显示某些内容,则可以编写以下内容:
if (false){
var x = 2;
}
您实际上并不能显示任何文本,但是至少它是一个更可见的标记,尤其是当您倾向于将(大多数)警告视为错误时。
我正在使用的一个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/"
如果您不愿意调整构建设置,那么另一种简单的家庭补救方法是在评论前面放置一个编辑器占位符:
<#todo#>// stop and fixme!
生成时会出现“源文件中的编辑器占位符”错误,但是与Jordan的解决方案不同,在键入时没有烦人的烦人行为:
经过大量的搜索和渴望,我确信不存在这样的实体。我仍然对最新的Xcode发行说明充满希望,因为它提到仍然缺乏#pragma标记机制,因此#warning和#error也可能会出现。
顺便说一句,我强烈建议您在bugreport.apple.com上向Apple提交Radar 以添加此功能(您可以复制17702491)。
我们编写了一个可配置的工具,使您可以基于注释标签和构建配置,在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/"
我可能对支持错误和警告的Xcode 10迟到了,但只需输入一个String:
"Need to finish implementing this"
会产生警告:String literal is unused
自动补全功能仍在运行,项目仍在编译中。
我的回答不能完全满足您的问题,但是如果您想轻松一点,可以使用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
它还具有添加新标签的首选项
此代码段的优势-它不会显示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
如何安装:
//WARNING
就像#pragma一样,//MARK
但是当前它们都未添加到XCode beta中。