下面的代码是在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 in
和guard
是什么!我对swift一无所知,如何使用if-else
或switch
来检查call.method
的上述两个值?
答案 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
部分只是在说您正在编写哪种类型的闭包。在这种情况下,闭包接受两个参数call
和result
并且不返回任何内容(Void
)。