guard
关键字非常棒,自从 Swift 2 推出以来我就一直在使用它。我能够在许多场景中成功使用它,包括这个:
for viewController in self.navigationController!.viewControllers {
guard let myCustomVC = viewController as? MyCustomViewController else {continue}
myCustomVC.doWhatItHasToDo()
break
}
就像魅力一样。迭代当前 navigationController
中的所有 viewController
,直到找到我想要的。
问题是:现在我需要更新上面的代码以在 for..in
范围之外重用 myCustomVC
变量。它应该像在作用域之前声明变量一样简单,但是我找不到一种方法来在没有 let
或 var
的情况下 guard
变量赋值关键字。
以下假设代码演示了我想要实现的目标,但 Swift 不允许我这样做:
var myCustomVC: MyCustomViewController
for viewController in self.navigationController!.viewControllers {
guard myCustomVC = viewController as? MyCustomViewController else {continue}
myCustomVC.doWhatItHasToDo()
break
}
// Now myCustomVC is available outside the for...in scope
myCustomVC.doWhatever()
Xcode 建议使用 ==
而不是 =
,因为它期望 guard
语句是 bool 上下文而不是变量赋值。
关于如何解决此问题有什么想法吗?
最佳答案
请原谅我没有回答你的问题。我认为你所要求的不可能。但我有一个替代方案。
看起来您正在一遍又一遍地手动编写 filter
方法。我建议只使用 filter
来查找您想要的元素。如果多个匹配,则使用 first
获取第一个。例如,下面我从列表中选择第一个偶数:
let myArray = [0,1,3,5,7,4,6,10,11]
let myNum = myArray.filter { $0 % 2 == 0 }.first
我不知道谓词使用的确切语法,但类似于以下内容
let myCustomVC = self.navigationController!.viewControllers.filter {
$0 is MyCustomViewController }.first
// myCustomVC will be an optional because first returns an optional
if let myCustomVC = myCustomVC {
myCustomVC.doWhatItHasToDo()
myCustomVC.doWhatever()
}
或者,如果您要对与谓词匹配的每个元素执行操作,则使用 foreach
let myCustomVC = self.navigationController!.viewControllers.filter {
$0 is MyCustomViewController }.foreach { // action // }
关于variables - 如何在 Swift 2 中保护现有变量赋值而不使用 let/var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34364254/