我读到一篇文章说,当UIViewController类创建时,属性需要为零,然后是情节提要,或者在调用viewDidLoad时将其添加到值中。
它说在构造对象时也不能初始化属性。
根据文章,如下所示请注意,它是自定义按钮,而不是来自情节提要。
class BetterViewController: UIViewController {
var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
myButton = UIButton() // I set value to myButton.
let anotherVariable = myButton.method // whatever method
}
上面,myButton首先是nil类型,然后在viewDidLoad时为它设置了一个值。到目前为止一切都很好。但是我看到很多代码,如下所示
class ToDoListVewController: UITableViewController {
let defaults = UserDefaults.standard
var itemArray = [Item]() //
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let items = defaults.array(forKey: "ToDoListArray") as? [String]{
itemArray = items
}
}
上面的例子,itemArray 不是 nil。但是当UITableViewController创建时,它需要为零。所以我必须在视图内声明 itemArray DidLoad 或者没问题?我很困惑。
没有更多的上下文,这篇文章是错误的。显然,您可以像您显示的示例一样内联初始化属性。如果你想让我解释为什么这篇文章这么说,你应该包括一个指向文章的链接。
通常,我们希望将属性设置为nil
,并在属性的初始化需要使用self
时viewDidLoad
初始化它。手势识别器就是一个很好的例子。我们不能这样做:
let myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)
因为使用了self
。到上述执行时,self
可能尚未正确构造,因此编译器禁止此类操作。因此,我们只能将其设置为零:
var myGestureRecognizer: UITapGestureRecognizer!
并在viewDidLoad
中初始化它:
myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)
另一方面,如果属性的初始化不需要构造self
,则可以内联初始化它。例如,如果要跟踪用户点击按钮的次数:
// Without doubt, this will be 0 at the start
var buttonPressedCount = 0