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)
}
...