Xcode Swift 编译器警告永远不会被执行

标签 xcode swift

我有这样的代码:

enum enumThingType {
    case apples
    case oranges
    case starfruit
}

func myFunc( enumThing: enumThingType ) -> String {
    switch enumThing {
    case .apples:
        return "Hey, apples"
    case .oranges:
        return "Hey, oranges"        
    default:
        return ""
    }
}

我正在非常缓慢地为所有案例填写代码,并且在为 starfruit 及其同类代码编写代码时,我需要代码正常运行。

一切都很好,但是编译器发出警告 will never be executed for return ""。它很乐意生成一个可执行文件,但我有强制症,希望警告和错误消失。

如果我删除 return "" 行,那么我将得到非常真实的编译器阻止 Missing return in a function expected to return 'String'

同样,如果我只是删除 default:...,我会得到同样引人注目的错误 Switch must be exhaustive, consider adding a default clause,这是完全可以理解的,但我在阻止警告和错误方面很有创意。

那么鉴于此构造,我是否可以在为 myFunc 的现有案例编码的同时消除警告和错误?

编辑

正如@appzYourLife 所指出的,我在我的示例代码中省略了导致错误的预编译器指令。此代码与预编译器指令一起引发警告:

enum enumThingType {
    case apples
    case oranges
    case starfruit
}

func myFunc( enumThing: enumThingType ) -> String {
    switch enumThing {
    case .apples:
        return "Hey, apples"
    case .oranges:
        return "Hey, oranges"        
    default:
    #if DEBUG
        print( "Ouch!" )
    #else
        fatalError()
    #endif
        return ""
    }
}

因为如果产品不是在指定 DEBUG 的情况下创建的,则返回永远不会发生——FatalError() 会阻止这种情况。

但是,这段代码不会对所有预编译器指定的情况发出警告:

func myFunc( enumThing: enumThingType ) -> String {
    switch enumThing {
    case .apples:
        return "Hey, apples"
    case .oranges:
        return "Hey, oranges"        
    default:
    #if DEBUG
        print( "Ouch!" )
        return ""
    #else
        fatalError()
    #endif
    }
}

我只是想总结一下实际的代码修复,以供可能遇到此问题的任何人使用,因为缺少正确指定的 DEBUG 标志修复了 DEBUG 条件,而不是非 DEBUG 条件。再次感谢所有为此提供帮助的人!

最佳答案

我关注了你与 @matt 的聊天,所以看起来你在问题中发布的代码不是真实代码;)

真正的代码是这样的

func myFunc( enumThing: enumThingType ) -> String {
    switch enumThing {
    case .apples:
        return "Hey, apples"
    case .oranges:
        return "Hey, oranges"
    default:
        #if DEBUG
        print("...")
        #else
        fatalError()
        #endif
        return ""
    }
}

现在我收到了您的警告,这是完全正确的。

事实上,由于 DEBUGNOT 定义的,所以 #else block 将被执行。

所以 fatalError() 将被执行。

并且由于您在 fatalError() 之后立即放置了一个 return ""... 那么 return 当然永远不会执行。

编译器是对的。

更新:定义 DEBUG 编译器标志

  1. 打开项目根目录
  2. 选择目标
  3. 寻找 Swift Compiler - Custom Flags 部分
  4. 添加调试或发布此条目:-D DEBUG

enter image description here

关于Xcode Swift 编译器警告永远不会被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35530568/

相关文章:

ios - 如何在 View 更改时保留 UITextField 文本

objective-c - 关于-Xcode 错误-> Clang : error: no input files

ios - 使用 codegen 的核心数据实体导致 "initializer required ' init(entity :insertInto: )' " error

ios - 如何使用 Xcode Storyboards 进行项目协作?

ios - @导入X;导致错误 Could not build module X

ios - 在 iOS 中,如何使用 Xcode 从 Localizable.strings 中删除语言

swift - Swift 标准字典是否具有获取或设置功能?

ios - 在 iOS 中围绕枢轴点旋转 ImageView

arrays - 如何获取对数组中对象的引用

swift - 如何将 MKPointAnnotation 保存到 Pars?