【问题标题】:Swift: #warning equivalent斯威夫特:#warning 等价物
【发布时间】:2014-08-02 17:50:49
【问题描述】:

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

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

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

【问题讨论】:

  • 我假设它将是 //WARNING 就像 #pragma 将是 //MARK 但目前它们都没有添加到 XCode 测试版中。
  • 我强烈建议您提交雷达请求//WARNING
  • @pixel 我刚刚提交了雷达
  • 你能接受乔丹史密斯的回答吗?这现在作为 #warning 内置在 Swift 中

标签: swift


【解决方案1】:

编辑

从 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 是一些示例。

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

【讨论】:

  • ...为什么所有的反对票?这与此处的任何其他方法一样有效。如果你不赞成投票,至少给出一个理由,也许我不够清楚,或者我所做的事情有问题。我很想知道是否有。
  • 是的,我不确定为什么没有更多人赞成。所有其他解决方案都太复杂了。
  • @ZaEeMZaFaR 编译器很可能会摆脱它。此外,在大多数情况下,这些问题将在发布前得到修复。而且 - 即使出于某种原因,编译器还不够聪明,无法摆脱它(我认为这不太可能) - 内存中的 100 个 Int 变量是 6.4kb 的内存 - 基本上没有。抱歉,我认为您的观点没有道理。
  • 我使用了其他的,但切换到使用这个。这是最简单的,您甚至可以给自己一个会在警告中显示的小消息,即:let fixMeMakeMeNonOptional: Int 在问题导航器中为您提供Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it。所有其他解决方案都会为您提供更通用的错误消息。
  • @NathanPerry 是的,同意。设置一些复杂的东西并不总是一种选择,尤其是当你在一个团队或多个项目中工作时。另外,简单的解决方案总是最好的。我目前只是在评论中将消息放在它旁边,但你所做的也不是一个坏主意。
【解决方案2】:

未来,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: cmets 标记警告。

或者,您可以在上面的代码中使用自定义标签修改 TAGS:TAGS="WARNING:",这将保留 TODO 和 FIXME 的默认行为,并会在任何标记为 // WARNING: 的 cmets 上引发编译时警告。

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

或者,您可以使用“发布”而不是“调试”来仅针对生产版本。

【讨论】:

  • 这是一个非常好的临时解决方案,直到 Apple 修复它:)
  • 这个问题是我的应用有两种模式——开发和生产。我想知道它在生产中构建干净,但我在开发中收到警告,基本上提醒我我处于开发模式 - 使用不同的 URL、超时、其他设置等。上面 Arie 的建议让我这样做,你的技术只是标记一切。也就是说,这种技术肯定有用,所以我也投了赞成票!
  • 多么有用的想法!感谢您分享这些有用的信息。
  • @kyle 请告诉我 perl -p -e "s/($TAGS)/ warning: \$1/" 这行的意思
  • 效果很好,但是我必须在find 命令中添加-type f 选项才能从查找结果中排除目录。这对大多数人来说应该不是问题,但是任何使用 R.swift pod 的人都会遇到与我相同的错误,因为 R.swift 是一个目录
【解决方案3】:

发布 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 中,您可以将不同种地标用于不同目的。 以下是 Apple 对此的评价:

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

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

//TODO: Clean up this code after testing

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

//FIXME

编辑: 然而,这些地标仅出现在 XCode 的跳转栏中,这可能不是您想要的,也不是人们所期望的——尤其是来自 //TODO: 和 //FIXME 标记。我已经为此提交了一份雷达:#17776817。希望 Apple 将在 XCode 6 的未来版本中添加此功能。

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

【讨论】:

  • 不幸的是,当您编译您的应用程序时,这些不会显示在警告面板中。我仍在等待一个像拇指酸痛一样突出的产品,这样您就不会忘记它们。这些只是显示在跳转栏中,您需要记住在您的项目中搜索“//TODO”才能找到它。或者,如果有人知道如何在整个项目中看到它们,请告诉我。 - 另一个雷达的时间:)
  • 嗯,是的,你是对的。我认为跳转栏是左侧的侧栏,这些标记会出现在问题导航器上,但它们没有。我刚刚提交了一份雷达:#17776817。 :)
  • @SomeGuy 他们出现在跳转栏中是什么意思?据我所知,它们不在 Xcode 编辑器窗口顶部的栏上。 (对我而言)注意到它们的唯一方法似乎是使用 Command + F 搜索它们。地标在哪里显示?
  • @almel 跳转栏是文件顶部的下拉菜单,它给出了当前文件中的函数列表i.cubeupload.com/jLRwTs.png
【解决方案4】:

Apple 团队尚未添加。我决定做的可能是作弊,但至少它确实向我显示了 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**")

【讨论】:

  • 仅作记录:@availability 在 swift 2 中已重命名为“@available”。
【解决方案5】:

看看这个article

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

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 的目录
【解决方案6】:

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

if (false){
   var x = 2;
}

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

【讨论】:

  • 或者只做 if false {"警告信息"}
  • 这个解决方案很糟糕。但似乎是最好的。投赞成票,谢谢。
【解决方案7】:

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

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

【讨论】:

    【解决方案8】:

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

    【讨论】:

    • 有没有办法不让编译器抱怨?我得到“命令 /bin/sh 发出错误,但没有返回非零退出代码以指示失败”
    • 作为替代方案,请参阅comment above
    【解决方案9】:

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

    <#todo#>// stop and fixme!
    

    您在构建时会收到“源文件中的编辑器占位符”错误,但与 Jordan 的解决方案不同,在输入时不会出现让您烦恼的实时错误:

    【讨论】:

    • 好主意 - 但不是抛出警告而不是错误的想法吗?这样做不会让您在删除它之前进行构建,在许多(大多数?)情况下,这绝对不是您想要的。 Todo 和 fixme 标记有时需要花费数周的时间——我想你会想在这段时间内构建和运行你的项目 :)
    • 当然,这很好。这种方法仅适用于在提交甚至运行应用程序之前必须发生的更紧急的待办事项。主要的好处是语法高亮和其他编辑器的细节尽管存在这个占位符,但仍然可以继续工作。我自己在这里使用了其他一些方法,包括你的,但占位符有时在多任务处理时很有帮助。它适合与 Xcode 在自动完成函数调用时插入的占位符相同的用例。
    【解决方案10】:

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

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

    【讨论】:

    • 我尽了我的一份力:rdar://19005171
    • 还填了一个雷达
    【解决方案11】:

    我们编写了一个可配置的工具,可让您根据注释标签和构建配置在 Xcode 问题导航器中放置警告和错误:https://github.com/doubleencore/XcodeIssueGenerator

    安装它:

    brew tap doubleencore/tap
    brew install xcodeissuegenerator
    

    然后在 Run Script Build Phase 中加入一行:

    # 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 描述我们如何使用它。

    【讨论】:

      【解决方案12】:

      我可能迟到了 Xcode 10 支持错误和警告,但只是简单地输入一个字符串:

      "Need to finish implementing this"
      

      将产生警告:String literal is unused 自动完成功能仍在工作且项目仍在编译。

      【讨论】:

        【解决方案13】:

        我的回答不能完全满足你的问题,但如果你想要一些简单的东西,你可以使用alcatrazthis 插件,它适用于所有项目,无需任何额外准备。 只需执行以下操作:

        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
        

        它还具有添加新标签的偏好

        【讨论】:

          【解决方案14】:

          这个 sn-p 的优点 - 它不会显示来自 Pod 的警告:

          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
          

          如何安装:

          【讨论】:

            猜你喜欢
            • 2022-01-21
            • 2017-07-22
            • 2017-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-08
            • 2017-11-13
            • 2015-08-19
            相关资源
            最近更新 更多