Swift 编译器宏(警告或停止)

Posted

技术标签:

【中文标题】Swift 编译器宏(警告或停止)【英文标题】:Swift Compiler Macro (Warn or Stop There) 【发布时间】:2015-05-27 13:41:37 【问题描述】:

是否有任何可以与 Swift 一起使用的编译器宏?通常情况下,我经常使用模板,这些模板经常需要修改很多部分,自从转向 swift 之后,我已经失去了对 #warning 的喜爱

【问题讨论】:

你是指宏还是指令? 【参考方案1】:

你可以使用// MARK:

// MARK: - UIImagePickerControllerDelegate Methods
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage

    if let backgroundImageChangedBlock = self.backgroundImageChangedBlock 
        backgroundImageChangedBlock(backgroundImage: image)
    

    self.dismissViewControllerAnimated(true, completion: nil)


// MARK: - UINavigationControllerDelegate Methods
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) 
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)

Xcode 不支持#warning,但可以使用脚本短语:https://***.com/a/26869489/907422:

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

TAGS="WARNING"
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 插件之外的唯一出路。 .. @AdrianSluyters 这不是一个好的解决方案,但它确实有效。如果您知道更好的方法,请告诉我...【参考方案2】:

Swift 中没有编译器宏或其他 preprocessor directives。您可以设置构建配置,但我怀疑这不是您想要的。

您可以做的是使用documentation 将代码部分标记为需要更改。你也可以编写单元测试,除非你的模板被正确实现,否则它会失败。

Assertions 也可能是让模板化代码失败的好方法,除非它被正确实现。

【讨论】:

我不同意,因为有很多未记录的指令...我刚刚通过反汇编 swift 遇到了一些,请参阅此站点(翻译)以了解人们遇到的其他一些:@987654324 @ @AdrianSluyters 是的,您可能应该避免使用 undocumented internal functions。它们可能会在没有警告的情况下更改或产生意想不到的副作用。 我纯粹将它们用于我的内部模板,所以我不会太在意它们的变化。我更喜欢在编译时完全“停止”的“警告”列表(或由于未满足要求而导致的不祥错误。

以上是关于Swift 编译器宏(警告或停止)的主要内容,如果未能解决你的问题,请参考以下文章

在编译时发出警告?

c语言宏定义宏函数编译警告:warning: backslash and newline separated by space(后不能有空格)

编译器警告是不是会导致智能感知停止工作?

#error和line

在 Swift 中使用 CocoaPods 时忽略编译警告

Xcode 继续在 Swift 3 上构建