Swift 为默认 return 值生成错误

Swift generate error for default return value

下面的代码示例很好地说明了我所追求的。我有一个预期 return 给定类型的函数。它基于 incomplete 开关执行此操作。但是如果遇到 default 情况,我希望只是产生一个错误。而不是 return 一个 optional,有人选择 ! 然后在那一刻死去。

func someFunc(value:UInt8) -> SomeType {
    switch value {
    case 0x00:
        return SomeType.foo()
    case 0x13:
        return SomeType.bar()
    default:
        break // BUT I WANT AN ERROR HERE
    }
}
func someFunc(value:UInt8) -> (SomeType?,NSError?) {
switch value {
case 0x00:
    return (SomeType.foo(),nil)
case 0x13:
    return (SomeType.bar(),nil)
default:
    return (nil,NSError("Something wrong")
}

}

这就是我实现错误的方式。

如果你想让程序在默认情况下终止 (因为默认大小写会指示 编程错误 ), 使用 fatalError():

func someFunc(value:UInt8) -> SomeType {
    switch value {
    case 0x00:
        return SomeType.foo()
    case 0x13:
        return SomeType.bar()
    default:
        fatalError("Unexpected value \(value)")
    }
}

fatalError() 导致程序立即终止 带有类似

的错误消息
  fatal error: Unexpected value 99: file main.swift, line 13

fatalError() 函数用 @noreturn 标记(分别用 return 在 Swift 中输入 Never 3), 所以编译器不会抱怨丢失的案例或丢失 return 值。

assert()assertionFailure() 等类似函数相比, fatalError() 永远不会 "optimized away",它在调试、优化和未经检查的构建中进行评估。

struct SomeType {
    static func foo() -> SomeType {
        print("foo")
        return SomeType()
    }
    static func bar() -> SomeType {
        print("bar")
        return SomeType()
    }
}

struct E: ErrorType {}

func someFunc(value:UInt8) throws -> SomeType {
    switch value {
    case 0x00:
        return SomeType.foo()
    case 0x13:
        return SomeType.bar()
    default:
        throw E()
    }
}

do {
    try someFunc(100)
} catch {
    print("error")
}
// prints
// error