例如,我收集的是@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作为属性存储会产生一个内存周期吗?
答案 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将始终具有值。在 在这些情况下,删除检查和解包的需要是有用的 每次访问时都是可选的值,因为它可以安全地使用 假设所有时间都有值。
但是我可以说转换对象,你当然可以强制打开控制器和控制器,但是任何强制解包都会让一些程序员感到紧张,这就是为什么你很可能会看到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 ;被解除分配。