在哪种情况下,如果可以使用隐式未包装的选项?

时间:2018-01-03 17:26:04

标签: swift optional

例如,我收集的是@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)
    }
}

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

顺便说一下,将fromVC和toVC作为属性存储会产生一个内存周期吗?

1 个答案:

答案 0 :(得分:1)

你对隐式解包的(function g(){ var g = function(){ return 1; } return g(); g = function(){ return 2; } })() 选项是正确的,但显然没有问题:https://cocoacasts.com/should-outlets-be-optionals-or-implicitly-unwrapped-optionals

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

  

... optionals表示允许常量或变量   “没有价值”。有时从程序的结构中可以清楚地看出   在首次设置该值之后,optional将始终具有值。在   在这些情况下,删除检查和解包的需要是有用的   每次访问时都是可选的值,因为它可以安全地使用   假设所有时间都有值。

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

但是我可以说转换对象,你当然可以强制打开控制器和控制器,但是任何强制解包都会让一些程序员感到紧张,这就是为什么你很可能会看到IBOutlet动画对象:

guard

有时候,物体会变得臃肿,交通会变得拥挤,而且每次都不应该像往常一样。这就是为什么我更喜欢使用警卫,因为我经验丰富的方法总是在压力下完全开火,隐式展开会使整个应用程序崩溃,而后卫则不会。警卫也可以使调试更容易。

至于创建非预期的引用周期,这是绝对可能的,因为我已经体验过,如果您确实使实例的视图控制器属性为它们func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { guard let fromViewController = transitionContext.viewController(forKey: .from), let toViewController = transitionContext.viewController(forKey: .to) else { return transitionContext.completeTransition(false) } ... 变量并验证它们是&#39 ;被解除分配。