Ios 如何安全地尝试在Swift中执行segue,同时忽略/手动处理可能的异常?

Ios 如何安全地尝试在Swift中执行segue,同时忽略/手动处理可能的异常?,ios,swift,segue,Ios,Swift,Segue,我正在尝试在我的项目中使用自定义视图控制器,它可能有3个分段。但这些并不是强制性的。 当视图控制器加载时,我正在调用一个方法“trySegues()”,该方法应该尝试执行所有3个步骤。Segue是自定义的,因此每个成功的调用都将在我的代码中处理和注册 在Objective-C中,我会使用“@try-@catch”,这样所有成功的调用都会继续进行,而如果没有设置其中一个segue,它会引发异常,但它将由我手动处理,因此不会中断程序的执行 在Swift中有没有同样的方法? 使用Optionals来模

我正在尝试在我的项目中使用自定义视图控制器,它可能有3个分段。但这些并不是强制性的。 当视图控制器加载时,我正在调用一个方法“
trySegues()
”,该方法应该尝试执行所有3个步骤。Segue是自定义的,因此每个成功的调用都将在我的代码中处理和注册

在Objective-C中,我会使用“
@try
-
@catch
”,这样所有成功的调用都会继续进行,而如果没有设置其中一个segue,它会引发异常,但它将由我手动处理,因此不会中断程序的执行

在Swift中有没有同样的方法?
使用Optionals来模拟异常将不起作用,因为performsguewithidentifier函数不返回任何值。

以任何想象不到的方式,都是
@try
-
@catch
-使用
performsguewithidentifier:
解决此问题的适当方法。不在Objective-C中,不在Swift中

Segues不能(或不应该)独立于故事板而存在。毕竟,如果您试图实例化一个segue,那么类名就是UI故事板segue。这个类甚至公开存在的事实并不是为了让您可以实例化它并在运行时添加它。它的存在使您可以对segue进行子类化,在情节提要上选择您的子类,并设置具有自定义行为的segue:

在Objective-C和Swift中,例外是为真正的异常行为保留的。在发展期可以预防的行为。在发布应用程序之前,我们不应该在运行时依赖于
@try
-
@catch
块。我们应该已经修复了我们的应用程序,这样就没有什么可捕获的了

这么说来,
performsguewithidentifier:
可以引发异常的唯一方法是如果我们提供的segue标识符不存在。segue不应该存在的唯一原因是因为我们在某处打错了

分段在编译时连接和定义。没有公共机制来检查某个特定的segue是否存在,因为我们根本不应该这样做


现在,尽管如此,如果我们想在运行时动态推送或以模式呈现特定的视图控制器,并且我们无法在编译时知道它将是什么视图控制器(或者从哪个视图控制器获取它),那么我们不应该通过segue来呈现它

相反,我们应该使用定义的一个表示选项

你的选择是:

  • presentViewController(uquo;动画:完成:)
  • showViewController(\uu:sender:)
  • showtailviewcontroller(\uu:sender:)
你需要的是这样的东西,而不是放松的阶段:

  • dismissViewControllerAnimated(uu:completion:)

你不应该那样做。obj-c中的try-catch方法的性能非常差,会减慢整个应用程序的运行速度。您也不应该随机调用performsguewithidentifier,等待它工作。那真是一件难看的工作。只有在需要的时候才给他们打电话shouldPerformSegueWithIdentifier@Thomas我看不出有什么帮助。谢谢你的回复和解释。我在网上的菜单控制器代码中看到过这个想法,所以我想在我的项目中使用它,但需要用swift翻译。看到大家一致告诉我这是对@try-@catch的错误使用,以及对segues的误用,我开始质疑这个想法,我深入研究了我试图复制的代码,后来我决定放弃它。我稍微不同意你的推理。我想用一个很好的例子来说明,DroperController支持左抽屉和右抽屉。如果您想将其扩展为可用于故事板,则需要添加对3个阶段的支持:左、中、右。然而,并不是每个人都需要一个合适的控制器。因此,如果通过故事板设置抽屉控制器,则可能会丢失左侧或右侧序列(这是一种适当的行为)。在这种情况下你会怎么做?