斯威夫特(Swift)-有没有不扔就匹配错误的方法?

时间:2018-07-12 13:21:05

标签: swift

在某些情况下,错误是作为参数提供的,而不是引发错误。一个示例可以是其中提供Result<T, Error>的完成处理程序。我想匹配错误而不抛出错误。

通过抛出错误进行匹配的示例:

enum MyError: Error {
    case error
}

func process(error: Error) {
    do {
        throw error
    } catch MyError.error {
        print("this is it")
    } catch {
        print("unknown error")
    }
}

process(error: MyError.error)

更新:

即使对于系统提供的错误(例如URLError不是enum类型的错误),匹配也应该起作用。

func process(error: Error) {
    do {
        throw error
    } catch URLError.timedOut {
        print("this is not it")
    } catch URLError.cancelled {
        print("this is it")
    } catch {
        print("unknown error")
    }
}

process(error: URLError(.cancelled))

2 个答案:

答案 0 :(得分:3)

您可以使用if case语法。

在您的示例中,

enum MyError: Error {
    case error
}

func process(error: Error) {
    if case MyError.error = error {
        print("this is it")
    } else {
        print("unknown error")
    }
}

process(error: MyError.error)

答案 1 :(得分:1)

有几种方法可以匹配未引发的错误。使用import React, { Component } from 'react'; import { Text, PanResponder, Alert } from 'react-native'; import { ImagePicker, Permissions } from 'expo'; export default class App extends Component { panResponder = PanResponder.create({ onStartShouldSetPanResponder: () => true, onPanResponderGrant: e => { this.start = e.nativeEvent.pageX; }, onPanResponderRelease: e => { if (this.start - e.nativeEvent.pageX > 100) { Promise.all([ Permissions.askAsync(Permissions.CAMERA), Permissions.askAsync(Permissions.CAMERA_ROLL), ]).then(([{ status: status1 }, { status: status2 }]) => { if (status1 !== 'granted' && status2 !== 'granted') { Alert.alert('Permission not granted'); return; } ImagePicker.launchCameraAsync().catch(e => Alert.alert('Failed to launch camera', e.message) ); }); } }, }); render() { return ( <Text {...this.panResponder.panHandlers} style={{ flex: 1, paddingTop: '50%' }}> Pan left to open camera </Text> ); } } 语句可以使代码保持简单,并避免许多错误:

更新:

我现在已经更新了代码,以包含您所请求的switch

URLError