通过开关或if-else更换防护罩

时间:2018-12-01 12:31:25

标签: swift flutter

下面的代码是在platform-channels中使用Flutter的一部分,该函数正在调用本机iOS函数(即swift函数

batteryChannel.setMethodCallHandler({
    [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
    guard call.method == "getBatteryLevel" else {
        result(FlutterMethodNotImplemented)
        return
    }
    self!.receiveBatteryLevel(result: result)
})

我需要添加call.method的另一张支票,如下所示。

call.method == "getText" else {
        result(FlutterMethodNotImplemented)
        return
}
self!.getText(result: result)

我不知道Void inguard是什么!我对swift一无所知,如何使用if-elseswitch来检查call.method的上述两个值?

2 个答案:

答案 0 :(得分:3)

正如其他人所说,您正在为batteryChannel对象提供一个调用处理程序。 (call: FlutterMethodCall, result: FlutterResult) -> Void位提供了呼叫处理程序的参数和返回值。

[weak self]部分是一个“捕获列表”,可防止闭包强烈捕获自身并创建保留周期。在闭包self中可能为零,因此您需要防止这种情况。我添加了一个保护声明,以简单地在这种情况下如果self为零就返回。

(使用self!强行解开是不好的,如果self是nil会崩溃。请勿这样做。)

我建议将您的代码重写为switch语句:

batteryChannel.setMethodCallHandler({
    [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
    guard let strongSelf = self else { return }  //Make sure self isn't nil

    switch call.method {
      case "getBatteryLevel": 
        strongSelf.receiveBatteryLevel(result: result)
      case "getText":
        strongSelf.getText(result: result)
      default:  //Code for case where you don't recognize the call method
        result(FlutterMethodNotImplemented)
    }
})

编辑:

一条guard语句说:“确保以下表达式为真,否则请退出”:

guard <boolean> else { code that exits scope }

当您仅检查一种可能的调用方法时,可以使用guard语句。您的代码说:“如果调用方法不是“ getBatteryLevel”,请退出。”您可以将其重写为“如果调用方法不是“ getBatteryLevel”或“ getText”,则退出”,但改用switch语句似乎更干净。这样,您的代码要么有大小写处理调用方法,要么落入默认大小写,从而触发了result(FlutterMethodNotImplemented)方法调用。

您应该阅读Apple iBook“ Swift编程语言”。您正在处理的许多概念和语法尚不了解,需要进行一些研究。 iBook的前半部分是有关该语言的教程,并且易于阅读。

答案 1 :(得分:2)

您可以使用这样的开关:

switch call.method {
    case "getBatteryLevel":
        self!.receiveBatteryLevel(result: result)
    case "getText":
        self!.getText(result: result)
    default:
        result(FlutterMethodNotImplemented)
}

(call: FlutterMethodCall, result: FlutterResult) -> Void in部分只是在说您正在编写哪种类型的闭包。在这种情况下,闭包接受两个参数callresult并且不返回任何内容(Void)。