斯威夫特:#warning当量

Som*_*Guy 189 swift

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

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

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

在此输入图像描述

Kyl*_*len 155

在未来,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/"
Run Code Online (Sandbox Code Playgroud)

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

编辑: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
Run Code Online (Sandbox Code Playgroud)

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

  • 工作得很好,但是我必须在`find`命令中添加`-type f`选项以从查找结果中排除目录.对于大多数人来说这应该不是问题,但是任何使用`R.swift` pod的人都会遇到同样的错误,因为`R.swift`是一个目录 (3认同)

Jor*_*ith 146

编辑

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

#warning("Warning description")
#error("Throws a build error")
Run Code Online (Sandbox Code Playgroud)

原始答案

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

// Description of what you need to fix

var FIX_ME__: AnyObject
Run Code Online (Sandbox Code Playgroud)

抛出警告"FIX_ME__"从未使用过.

如果你愿意,可以将表情符号添加到变量名中......我经常使用,对于真正需要修复的东西我甚至会考虑.您可以替换FIX_ME__使用任何你想要的:ALGORITHM_NEEDS_REVIEW,BugID_148或者JOHNNY_YOU_BROKE_THIS是一些例子.

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

  • 是的,我不确定为什么这不会被更多投资.所有其他解决方案都太复杂了. (15认同)
  • ...为什么所有的投票?这与其他任何方法一样有效.如果你投票,至少给出一个理由,也许我不够清楚,或者我正在做的事情有问题.我很想知道是否有. (6认同)
  • 我使用其他人但转而使用这个.它是最简单的,你甚至可以给自己一个消息,它会显示在警告中,即:`let fixMeMakeMeNonOptional:Int`给你```不可变值fixMeMakeMeNonOptional从未使用过; 考虑在问题导航器中替换为_或删除它```.所有其他解决方案都会为您提供更多通用错误消息. (4认同)
  • @ZaEeMZaFaR编译器很可能会摆脱它.此外,在大多数情况下,这些问题将在发布之前得到解决.并且 - 即使出于任何原因,编译器也不够聪明,无法摆脱它(我认为这是不太可能的) - 内存中的100个Int变量是6.4kb的内存 - 基本上没什么.我不认为你有一个有效的观点抱歉. (3认同)

Jee*_*hut 77

发布WWDC 2018更新

从Xcode 10和Swift 4.2开始,您现在可以#warning再次使用:

#warning("TODO: Clean up this code after testing")
Run Code Online (Sandbox Code Playgroud)

这将在Xcode中像预期一样显示为警告!

这甚至与#if检查结合使用,例如,如果您的目标平台是iOS,则以下内容仅显示警告:

#if os(iOS)
    #warning("this code is untested in iOS")
#endif
Run Code Online (Sandbox Code Playgroud)

#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即将推出的版本中添加它.

SOLUTION(EDIT 2): 如果你通过自制安装斯威夫特短绒(运行brew install swiftlintbrew update添加)建议构建脚本到你的项目,那么你会看到所有TODOFIXME地标出现在Xcode警告.SwiftLint甚至会添加一些警告/错误,您可以根据自己的需要进行配置 - 我只能推荐使用SwiftLint,它可以很好地解决这个问题!

  • 不幸的是,当您编译应用程序时,这些内容不会显示在警告面板中.我还在等一个伸出拇指的拇指,这样你就不会忘记它们.这些只是显示在跳转栏中,您需要记住在项目中搜索"// TODO"才能找到它.或者,如果有人知道如何在整个项目中看到它们,请告诉我. - 另一个雷达的时间:) (7认同)
  • @almel跳转栏是文件顶部的下拉列表,它提供当前文件中的函数列表http://i.cubeupload.com/jLRwTs.png (2认同)

int*_*upt 55

尚未被Apple团队添加.我决定做的可能是作弊,但至少它确实向我显示了FIXME消息.所以我要做的是在Swift文件中声明FIXME()函数:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}
Run Code Online (Sandbox Code Playgroud)

当我从任何其他功能调用它时,它确实显示警告,例如

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

对于Swift 2使用

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
Run Code Online (Sandbox Code Playgroud)

  • 仅供记录:@availability在swift 2中已重命名为"@available". (2认同)

kel*_*lin 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/"
Run Code Online (Sandbox Code Playgroud)

结果是: 在此输入图像描述


Ari*_*sky 12

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

if (false){
   var x = 2;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 或者只是做假的{"警告信息"} (11认同)

sfl*_*gen 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/"
Run Code Online (Sandbox Code Playgroud)


Har*_*ins 5

提出实现了这个功能,它将随Swift 4.2一起提供.您现在可以通过masterswift.org上下载工具链来使用它.

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Run Code Online (Sandbox Code Playgroud)


rcw*_*cw3 3

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

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