繁体   English   中英

UIViewController子类上的Swift可选或Implicit属性

[英]Swift optional or Implicit property on UIViewController subclass

我有以下课程

class Foo : UIViewController {
  var demo : SKView

  override func viewDidLoad() {
    ...
    self.demo = SKView(...)
    ...
    self.view.insertSubview(demo, atIndex: 0)
  }

  override func viewWillDisappear(animated : Bool) {
    self.demo.removeFromSuperView()
    self.demo = nil
  }
}

我的问题是,因为我在Foo上没有初始化器,所以demo必须是? 或者! 我读过许多我应该远离使用的地方! 但是,在这种情况下,有没有理由不使用它? 由于视图本身将始终在viewDidLoad上设置并且仅在viewWillDisappear上取消设置,因此我不是100%明确了解此案例的缺点。

这类课程中这类属性最常见的模式是什么? viewDidLoad设置的属性,并且始终具有值。

原因是Swift强制类成员在初始化时始终具有值。 通过标记变量demo ! 还是? 你告诉编译器这个变量的值可以是nil ,因此是可选的表示法。

在iOS开发环境中,标记SKView是完全可以接受的! 所以你不必后缀每次调用demo?

如果demonil并且您需要始终存在值,那么应用程序将在运行时崩溃,在许多情况下实际上是可取的。

class Foo : UIViewController {
  var demo : SKView!

  override func viewDidLoad() {
    ...
    self.demo = SKView(...)
    ...
    self.view.insertSubview(demo, atIndex: 0)
  }

  override func viewWillDisappear(animated : Bool) {
    self.demo.removeFromSuperView()
    self.demo = nil
  }
}
class Foo: UIViewController {
    var demo: SKView = SKView()

    ...
}

100%自Foo()以来不会是零。

或者你可以覆盖init(),但我不喜欢它。 如果我确定我不会在ViewDidLoad()之前使用该属性,我更喜欢在ViewDidLoad()中编写初始化,并标记为var demo: SKView!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM