声明静态全局NSTextField数组遇报错:ViewController类无初始化器
解决“Class ViewController has no initializers”报错的方案
问题原因
Swift要求类的所有非可选存储属性必须在实例初始化完成时拥有确定的值。你声明的fieldArray是[NSTextField]类型(非可选),既没有初始值,也未在初始化方法中赋值,因此编译器抛出该错误。
解决方案
方案1:将数组声明为可选类型
把数组类型改为可选,它会默认初始化为nil,满足Swift的初始化规则,之后在viewDidLoad中赋值即可。
class ViewController: NSViewController { @IBOutlet weak var TextField01: NSTextField! @IBOutlet weak var TextField02: NSTextField! @IBOutlet weak var TextField03: NSTextField! var fieldArray: [NSTextField]? override func viewDidLoad() { super.viewDidLoad() fieldArray = [TextField01, TextField02, TextField03] } }
方案2:给数组初始化为空数组
直接在声明时赋值空数组,后续在viewDidLoad中替换为目标数组。
class ViewController: NSViewController { @IBOutlet weak var TextField01: NSTextField! @IBOutlet weak var TextField02: NSTextField! @IBOutlet weak var TextField03: NSTextField! var fieldArray: [NSTextField] = [] override func viewDidLoad() { super.viewDidLoad() fieldArray = [TextField01, TextField02, TextField03] } }
方案3:使用懒加载属性
用lazy关键字修饰,数组会在第一次被访问时执行闭包初始化,既满足初始化规则,又能利用已加载的IBOutlet控件。
class ViewController: NSViewController { @IBOutlet weak var TextField01: NSTextField! @IBOutlet weak var TextField02: NSTextField! @IBOutlet weak var TextField03: NSTextField! lazy var fieldArray: [NSTextField] = { [TextField01, TextField02, TextField03] }() override func viewDidLoad() { super.viewDidLoad() // 无需额外赋值,首次使用fieldArray时自动初始化 } }
关于静态全局数组的补充
如果需要静态全局的数组(属于类本身,所有实例共享),可以添加static关键字:
class ViewController: NSViewController { @IBOutlet weak var TextField01: NSTextField! @IBOutlet weak var TextField02: NSTextField! @IBOutlet weak var TextField03: NSTextField! static var fieldArray: [NSTextField] = [] override func viewDidLoad() { super.viewDidLoad() ViewController.fieldArray = [TextField01, TextField02, TextField03] } }
注意:静态数组会被所有ViewController实例共享,需根据实际业务场景选择使用。
内容的提问来源于stack exchange,提问作者Bob7430
相关产品推荐
相关产品推荐

