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

时间:2016-02-20 23:55:46

标签: 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 及其类似代码中编写代码。

一切都很好,但编译器会为return ""发出警告永远不会执行。它很乐意生成一个可执行文件,但我很强迫,并希望警告和错误消失。

如果我删除了行return "",那么我会得到非常真实且编译器在预期返回的函数中阻止缺少返回'字符串'

同样,如果我只删除default: ...,我会得到同样令人抓狂的错误切换必须是详尽的,考虑添加默认条款,这是完全可以理解的,但我是我努力阻止警告和错误。

所以给定这个结构,我可以在编码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条件。再次感谢为此提供帮助的所有人!

1 个答案:

答案 0 :(得分:3)

我按照您与 @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 ""
    }
}

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

事实上,由于DEBUG NOT 已定义,因此#else块将被执行。

因此fatalError()将被执行。

由于你在return ""之后立即放置了fatalError() ......当然return永远不会被执行。

编译器是对的。

更新:定义DEBUG编译器标志

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