gpt4 book ai didi

ios - 我们是否必须在 UIViewController 中的 viewDidLoad 中或 viewDidLoad 之外初始化属性?

转载 作者:行者123 更新时间:2023-11-30 11:50:31 26 4
gpt4 key购买 nike

我读到一篇文章说,当创建 UIViewController 类时,属性需要为零,然后 Storyboard 或在调用 viewDidLoad 时将其添加到值中。

它表示在构造对象时也无法初始化属性。

根据文章,它会像下面这样请注意,它是自定义按钮,而不是来自 Storyboard。

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 不为零。但当 UITableViewController 创建时它需要为零。所以我必须在 viewDidLoad 中声明 itemArray 还是可以?我很困惑。

最佳答案

如果没有更多上下文,这篇文章就是错误的。显然,您可以内联初始化属性,就像您展示的示例一样。如果您想让我解释为什么这篇文章这么说,您应该包含该文章的链接。

一般来说,当属性的初始化需要使用self<时,我们希望将属性设置为nil并在viewDidLoad中初始化它/。手势识别器就是一个很好的例子。我们不能这样做:

let myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)

因为使用了self。当上面执行时,self可能还没有被正确构造,因此编译器禁止这种事情。因此,我们只能将其设置为nil:

var myGestureRecognizer: UITapGestureRecognizer!

并在viewDidLoad中初始化它:

myGestureRecognizer = UITapGestureRecognizer(target: self, selector: ...)

另一方面,如果属性的初始化不需要构造self,则可以内联初始化它。例如,如果您想跟踪用户点击按钮的次数:

// Without doubt, this will be 0 at the start
var buttonPressedCount = 0

关于ios - 我们是否必须在 UIViewController 中的 viewDidLoad 中或 viewDidLoad 之外初始化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com