Swift 通过开关或其他方式更换防护罩
下面的代码是调用本机iOS函数(即函数)的使用的一部分 我需要对call.method添加另一个检查,如下所示Swift 通过开关或其他方式更换防护罩,swift,flutter,Swift,Flutter,下面的代码是调用本机iOS函数(即函数)的使用的一部分 我需要对call.method添加另一个检查,如下所示 call.method == "getText" else { result(FlutterMethodNotImplemented) return } self!.getText(result: result) 我不明白什么是虚空和守卫!我对swift一无所知,因此如何使用if-else或switch检查call.method的上述两个值 您可以使用
call.method == "getText" else {
result(FlutterMethodNotImplemented)
return
}
self!.getText(result: result)
我不明白什么是虚空和守卫!我对swift一无所知,因此如何使用if-else或switch检查call.method的上述两个值 您可以使用如下开关:
switch call.method {
case "getBatteryLevel":
self!.receiveBatteryLevel(result: result)
case "getText":
self!.getText(result: result)
default:
result(FlutterMethodNotImplemented)
}
调用:flatterMethodCall,result:flatterResult->Void在某种程度上只是说明您正在编写什么类型的闭包。在这种情况下,接受两个参数的闭包调用并返回结果,但不返回Void。您可以使用如下开关:
switch call.method {
case "getBatteryLevel":
self!.receiveBatteryLevel(result: result)
case "getText":
self!.getText(result: result)
default:
result(FlutterMethodNotImplemented)
}
调用:flatterMethodCall,result:flatterResult->Void在某种程度上只是说明您正在编写什么类型的闭包。在本例中,接受两个参数的闭包调用并返回result,但不返回Void。正如其他人所说,您正在为batteryChannel对象提供一个调用处理程序。调用:flatterMethodCall,结果:flatterResult->Void位为调用处理程序提供参数和返回值 [weake self]部分是一个捕获列表,用于防止闭包强捕获self并创建保留周期。在闭包内部,self可能为零,因此需要针对这种情况进行保护。在这种情况下,如果self为nil,我添加了一个guard语句来简单地返回 使用自我!强制展开是不好的,如果self为零,则会崩溃。不要那样做。 我建议将代码重写为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语句似乎更为简洁。这样,您的代码要么有一个case来处理call方法,要么就是默认case,它触发resultFlutterMethodNotImplemented方法调用
你应该阅读苹果iBook的Swift编程语言。有很多概念和语法你还不了解,这需要一些研究。iBook的前半部分是关于该语言的教程,并且很容易阅读。正如其他人所说,您正在为batteryChannel对象提供一个调用处理程序。调用:flatterMethodCall,结果:flatterResult->Void位为调用处理程序提供参数和返回值 [weake self]部分是一个捕获列表,用于防止闭包强捕获self并创建保留周期。在闭包内部,self可能为零,因此需要针对这种情况进行保护。在这种情况下,如果self为nil,我添加了一个guard语句来简单地返回 使用自我!强制展开是不好的,如果self为零,则会崩溃。不要那样做。 我建议将代码重写为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语句似乎更为简洁。这样,您的代码要么有一个case来处理call方法,要么就是默认case,它触发resultFlutterMethodNotImplemented方法调用
你应该阅读苹果iBook的Swift编程语言。有很多概念和语法你还不了解,这需要一些研究。iBook的前半部分是关于该语言的教程,很容易阅读。如果您对swift一无所知,请阅读如果您对swift一无所知,请阅读谢谢,这是正确的,我在else中也做了同样的事情,但我不需要同时执行这两个函数,我需要每个函数只在相关的“call.methid”@HasanAYousef下执行,这有什么不同?这里需要的逻辑基本上是,如果call.method不是getBatteryLevel或不是getText,则给出NotImplementedResult,然后返回。你能解释一下你所说的每个函数只在相关的“call.method”下执行是什么意思吗?@HasanAYousef啊,我没有看到receiveBatteryLevel和getText调用!现在我明白你的意思了。看编辑。伟大的人都有相同的想法。我还建议了一个转换语句。它似乎比多个if语句更清晰,也更易于维护。请注意OP使用了[weake self]和self!。GetExtresult:容易崩溃。这需要更正,就像我的回答一样。谢谢,这是正确的,我在else中做了同样的事情,但我不需要两个函数一起执行,我需要每个函数只使用相关的“call.methid”执行
@HasanAYousef这有什么不同?这里需要的逻辑基本上是,如果call.method不是getBatteryLevel或不是getText,则给出NotImplementedResult,然后返回。你能解释一下你所说的每个函数只在相关的“call.method”下执行是什么意思吗?@HasanAYousef啊,我没有看到receiveBatteryLevel和getText调用!现在我明白你的意思了。看编辑。伟大的人都有相同的想法。我还建议了一个转换语句。它似乎比多个if语句更清晰,也更易于维护。请注意OP使用了[weake self]和self!。GetExtresult:容易崩溃。这需要更正,正如我的回答。非常感谢您提供的详细解释和指导,谢谢。非常感谢您提供的详细解释和指导,谢谢。