Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在哪种情况下,如果完全可以使用隐式展开选项?_Swift_Optional - Fatal编程技术网

Swift 在哪种情况下,如果完全可以使用隐式展开选项?

Swift 在哪种情况下,如果完全可以使用隐式展开选项?,swift,optional,Swift,Optional,例如,我收集到的信息是,@IBoutlet被隐式展开,因为它们为nil是没有意义的,这样的事件只会由编程中的错误引起,使后续崩溃成为调试步骤 但是在UIViewControllerAnimatedTransitioning中,我可以存储 对象属性中的视图控制器,并隐式展开它们? 在这种情况下,使用隐式展开的选项是否合法/良好的做法,因为如果没有两个ViewController从/转换到,转换将没有意义 另一方面,将fromVC和toVC存储为属性是否会创建一个内存周期?关于隐式展开的IBOut

例如,我收集到的信息是,
@IBoutlet
被隐式展开,因为它们为
nil
是没有意义的,这样的事件只会由编程中的错误引起,使后续崩溃成为调试步骤

但是在
UIViewControllerAnimatedTransitioning
中,我可以存储 对象属性中的视图控制器,并隐式展开它们?

在这种情况下,使用隐式展开的选项是否合法/良好的做法,因为如果没有两个ViewController从/转换到,转换将没有意义


另一方面,将fromVC和toVC存储为属性是否会创建一个内存周期?

关于隐式展开的IBOutlet选项,您是正确的,但显然这并不是没有问题的:

我不使用Interface Builder,所以我不能在这里谈论个人经验

…选项表示允许常数或变量具有 “没有价值”。有时,从程序的结构可以清楚地看出 optional将始终有一个值,在第一次设置该值之后。在里面 在这些情况下,消除检查和打开包装的需要非常有用 optional的值,因为它可以安全地 假设始终有一个值

但是我可以谈论过渡对象,你当然可以在它们的视图控制器中强制展开,但任何类型的强制展开都会让一些程序员感到紧张,这就是为什么你很可能在动画对象中看到一个
防护装置的原因:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let fromViewController = transitionContext.viewController(forKey: .from),
        let toViewController = transitionContext.viewController(forKey: .to) else {

        return transitionContext.completeTransition(false)

    }

    ...
有时,物体会变得臃肿,交通会变得拥挤,而且并非所有东西都能一直正常工作。这就是为什么我更喜欢使用警卫,因为我经历过一些方法,这些方法在压力下不一定能完全启动,而隐式解包会使整个应用程序崩溃,而警卫则不会。防护还可以使调试更容易


至于创建非预期的引用循环,这是绝对可能的,因为我经历过,如果您确实使实例的视图控制器属性使其
变弱
变量,并验证它们是否正在解除分配。

animateTransition
中使用保护语句展开选项时,如果guard语句失败,是否有方法在没有动画的情况下继续执行视图控制器转换?您的示例中的代码完全阻止了转换的发生,至少在我的情况下是这样。@stackunderflow当然,您可以在
防护内部执行转换,而不是
返回transitionContext.completeTransition(false)
,只需将回退转换放在那里即可。但是,如果用户尝试转换而防护失败,无论出于何种原因,用户所要做的就是再次点击。最终用户可能会认为手机没有注册点击,更可能是因为手机而不是应用。但是,如果我进入防护故障块,这可能意味着fromViewController和/或toViewController(或者在我的情况下,它们下面的视图控制器层次结构中的元素)为零,所以我不能真正执行回退转换,这也是我不能解释保护失败的原因之一(但主要是因为稀有性)。我以为您考虑的是一个非动画转换。奇怪的是,如果我的解雇动画保护语句失败,我可以调用
completeTransition
,解雇转换将在没有动画的情况下发生。但演示过渡动画并非如此。我可能不在乎,因为我无法想象这样一种场景,即该代码在运行时会突然失败,但作为一种“最佳实践”,我的本能是安全地打开选项,并在必要时在没有动画的情况下执行转换
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let fromViewController = transitionContext.viewController(forKey: .from),
        let toViewController = transitionContext.viewController(forKey: .to) else {

        return transitionContext.completeTransition(false)

    }

    ...