2015-12-04 34 views
2

下面的代碼示例很好地說明了我在做什麼之後。我有一個預期會返回給定類型的函數。它是基於不完整的交換機。但是,如果達到default的情況,我希望只是產生一個錯誤。而不是返回optional哪個人選擇!,然後死在那一點。Swift生成默認返回值的錯誤

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 
    } 
} 
+0

如果你想完全停止執行,你可以使用'fatalError()'。 – JAL

回答

9

如果您希望程序在默認情況下 終止(因爲默認情況下將表明編程錯誤), 使用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(RESP。用 返回類型Never in Swift 3), 這樣編譯器就不會抱怨丟失的案例或者丟失 的返回值。

相反類似的功能像assert()assertionFailure()fatalError()從不「優化掉」,它在調試被評估,優化的和未選中的構建。

1
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") 
} 

}

這是我將如何實現的錯誤。

1
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