我在UIViewController类创建时读了一篇文章说属性需要为nil ,然后在调用viewDidLoad时将它添加到value中。
它表示在构造对象时也无法初始化属性。
根据文章,它将如下所示 请注意,它不是故事板中的自定义按钮。
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创建时它需要为nil。所以我必须在viewDidLoad中声明itemArray或者它可以吗?我很困惑。
答案 0 :(得分:0)
没有更多的背景,文章是错误的。您显然可以将内联属性初始化,就像您展示的示例一样。如果您希望我解释文章说明的原因,您应该包含文章的链接。
通常,我们希望将属性设置为nil
,并在初始化属性需要使用viewDidLoad
时在self
中初始化它。手势识别器就是一个很好的例子。我们不能这样做:
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