在 Swift 中的哪里初始化?
Where to initialize in Swift?
我有一个关于 Swift 中初始化的非常笼统的问题。
与 Objective C 不同,现在可以在函数外的声明中直接调用 init():
例如
class ViewController: UIViewController {
let myView: UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
myView.frame = getFrame()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}
在 Objective C 中,我会在我的函数中完成初始化。
但是如果我想调用一个没有设置参数的Initializer怎么办?
例如
我想用一个在 func()
中计算的框架来初始化
class ViewController: UIViewController {
//THIS IS NOT WOKRING
let myView: UIView = UIView(frame: getFrame())
override func viewDidLoad() {
super.viewDidLoad()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}
我不想在代码中的两个不同位置进行初始化。初始化有任何通用模式吗?
所以您在 swift 中的初始化选项有很多。对于您当前的示例,您还不能使用 getFrame()
方法,因为您还没有对 self
的引用,因为 ViewController
尚未初始化。相反,您可以使用:
let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))
因为这不需要引用 self。或者,您可以 lazy
实例化,它将在 self
可用后获得 运行 (这只能与 var
一起使用,而不是 let
:
lazy var myView: UIView = {
return UIView(frame:self.getFrame())
}()
为了回答您的问题,在使用 UIKit class 时您通常无法控制它们的实例化,您可以像在 objective c 中一样继续这样做并使用 implicitly unwrapped 可选值(以防止每次实例化变量时都必须使用 !
或 ?
,例如:
var myView: UIView!
override func viewDidLoad(){
super.viewDidLoad();
myView = UIView(frame:getFrame())
}
但这不适用于 let
常量,因为它们需要立即赋值或在对象的构造函数中赋值。希望这会有所帮助。
我有一个关于 Swift 中初始化的非常笼统的问题。 与 Objective C 不同,现在可以在函数外的声明中直接调用 init(): 例如
class ViewController: UIViewController {
let myView: UIView = UIView()
override func viewDidLoad() {
super.viewDidLoad()
myView.frame = getFrame()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}
在 Objective C 中,我会在我的函数中完成初始化。
但是如果我想调用一个没有设置参数的Initializer怎么办? 例如 我想用一个在 func()
中计算的框架来初始化class ViewController: UIViewController {
//THIS IS NOT WOKRING
let myView: UIView = UIView(frame: getFrame())
override func viewDidLoad() {
super.viewDidLoad()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)
}
func getFrame() -> CGRect {
return CGRectMake(0, 0, 100, 100)
}
}
我不想在代码中的两个不同位置进行初始化。初始化有任何通用模式吗?
所以您在 swift 中的初始化选项有很多。对于您当前的示例,您还不能使用 getFrame()
方法,因为您还没有对 self
的引用,因为 ViewController
尚未初始化。相反,您可以使用:
let myView: UIView = UIView(frame: CGRectMake(0, 0, 100, 100))
因为这不需要引用 self。或者,您可以 lazy
实例化,它将在 self
可用后获得 运行 (这只能与 var
一起使用,而不是 let
:
lazy var myView: UIView = {
return UIView(frame:self.getFrame())
}()
为了回答您的问题,在使用 UIKit class 时您通常无法控制它们的实例化,您可以像在 objective c 中一样继续这样做并使用 implicitly unwrapped 可选值(以防止每次实例化变量时都必须使用 !
或 ?
,例如:
var myView: UIView!
override func viewDidLoad(){
super.viewDidLoad();
myView = UIView(frame:getFrame())
}
但这不适用于 let
常量,因为它们需要立即赋值或在对象的构造函数中赋值。希望这会有所帮助。