Swift 通过开关或其他方式更换防护罩

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的上述两个值 您可以使用

下面的代码是调用本机iOS函数(即函数)的使用的一部分

我需要对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:容易崩溃。这需要更正,正如我的回答。非常感谢您提供的详细解释和指导,谢谢。非常感谢您提供的详细解释和指导,谢谢。