gpt4 book ai didi

swift - 在哪种情况下足以使用隐式展开的可选值?

转载 作者:行者123 更新时间:2023-11-28 15:08:19 24 4
gpt4 key购买 nike

例如,我收集到的是 @IBoutlet 是隐式解包的,因为它们是 nil 没有意义,这样的事件只会由编程错误,使随后的崩溃成为调试步骤。

但是在 UIViewControllerAnimatedTransitioning 中我可以存储对象属性中的 ViewControllers 并将它们隐式解包?

class SomeTransition: NSObject, UIViewControllerAnimatedTransitioning{

var fromVC: UIViewController!
var toVC: UIViewController!

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

fromVC = transitionContext.viewController(forKey: .from)
toVC = transitionContext.viewController(forKey: .to)
}
}

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

顺便说一句,将 fromVC 和 toVC 作为属性存储会创建内存循环吗?

最佳答案

关于隐式展开 IBOutlet 的说法是正确的可选项,但显然这并非没有问题:https://cocoacasts.com/should-outlets-be-optionals-or-implicitly-unwrapped-optionals

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

...optionals indicate that a constant or variable is allowed to have “no value”. Sometimes it’s clear from a program’s structure that an optional will always have a value, after that value is first set. In these cases, it’s useful to remove the need to check and unwrap the optional’s value every time it’s accessed, because it can be safely assumed to have a value all of the time.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

但是我可以谈谈转换对象,你当然可以强制打开它们中的 View Controller 和 View Controller ,但是任何类型的强制打开都会让一些程序员感到紧张,这就是为什么你很可能会看到 guard 的原因。在动画对象中:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

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

return transitionContext.completeTransition(false)

}

...

有时,对象会变得臃肿,交通会变得拥堵,并且一切都不会始终如常运行。这就是为什么我更喜欢使用守卫,因为我遇到过在压力下并不总是完美触发的方法,隐式展开会导致整个应用程序崩溃,而守卫则不会。守卫还可以使调试更容易。

至于创建意外的引用循环,那是绝对有可能的,因为我也有过这样的经历,所以如果你确实使实例的 View Controller 属性成为它们 weak变量并验证它们是否被释放。

关于swift - 在哪种情况下足以使用隐式展开的可选值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com