当我们在 ios、swift 中以编程方式创建 IBOutlet 时,引用类型的 let 和 var 有什么区别
what is the difference between let and var for reference types, when we create an IBOutlet programmatically in ios, swift
我们可以像下面 swift 中那样以编程方式定义和设置约束。我以四种不同的方式创建了四个标签销售点。如下图
var labelone : UILabel = {
var label = UILabel()
label.text = "Stack"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labeltwo : UILabel = {
let label = UILabel()
label.text = "Overflow"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
var labelthree : UILabel = {
let label = UILabel()
label.text = "Confused"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labelfour: UILabel = {
var label = UILabel()
label.text = "More confused"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
func addconstaraints() {
labelone.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelone.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelone.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
labeltwo.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labeltwo.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labeltwo.topAnchor.constraint(equalTo: labelone.bottomAnchor).isActive = true
labelthree.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelthree.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelthree.topAnchor.constraint(equalTo: labeltwo.bottomAnchor).isActive = true
labelfour.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelfour.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelfour.topAnchor.constraint(equalTo: labelthree.bottomAnchor).isActive = true
}
一切正常。有什么不同吗?希望你能帮助理解这一点。
我知道 let
和 var
变量定义的区别。奥特莱斯也一样吗?怎么才能看出outlet
的区别
let
:
let
Swift 中的关键字用于声明常量值,并且一旦定义就永远不能更改。
let name ="Kirit"
在你可以更改 name = "Modi"
之后你会遇到编译器错误。所以使用 let
关键字只声明一次它的值。
var
:
var
关键字在Swift中是可变的,用于声明变量值。该值可以在 运行 时间更改。这意味着可以更改太多次。
var name = "Kirit"
您可以更改 name = "Modi"
然后成功更新变量值。
在您的示例中,您正在考虑使用 var
与 let
来声明 属性 本身,以及在初始化 属性 的闭包内部.在回答您的问题时,最重要的是,在任何可以使用 let
(用于常量)的地方,理论上您可以使用 var
(用于变量),但只有在计划更改时才应该这样做那个变量稍后。对于引用类型,例如 UILabel
,这意味着如果您计划用 UILabel
.
的全新实例替换该标签
因此,第一个和第四个选项(其中 var
在闭包内部使用)可以立即被视为糟糕的编程风格,因为您不会在闭包范围内再次更改它,所以我们知道我们应该在闭包中使用 let
。关于第二个或第三个选项(即 属性 本身应该是常数还是变量),问题是您是否打算稍后用另一个替换 UILabel
。如果是这样,您必须使用第三个选项。但我们可以怀疑这不太可能是您的意图,因此如果您不打算稍后更换该标签,那么在这四个选项中,您会倾向于第二个选项 let
/let
.
话虽如此,这看起来像是在视图控制器中,我不建议在视图控制器实例化期间实例化任何视图对象。通常这会推迟到 viewDidLoad
,或者如果整个视图层次结构都是以编程方式构建的,则在 loadView
中。或者,更好的是,我们摆脱了手动构建控件的业务,让故事板在适当的时间实例化 IBOutlet
引用。
我们可以像下面 swift 中那样以编程方式定义和设置约束。我以四种不同的方式创建了四个标签销售点。如下图
var labelone : UILabel = {
var label = UILabel()
label.text = "Stack"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labeltwo : UILabel = {
let label = UILabel()
label.text = "Overflow"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
var labelthree : UILabel = {
let label = UILabel()
label.text = "Confused"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labelfour: UILabel = {
var label = UILabel()
label.text = "More confused"
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
func addconstaraints() {
labelone.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelone.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelone.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
labeltwo.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labeltwo.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labeltwo.topAnchor.constraint(equalTo: labelone.bottomAnchor).isActive = true
labelthree.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelthree.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelthree.topAnchor.constraint(equalTo: labeltwo.bottomAnchor).isActive = true
labelfour.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
labelfour.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
labelfour.topAnchor.constraint(equalTo: labelthree.bottomAnchor).isActive = true
}
一切正常。有什么不同吗?希望你能帮助理解这一点。
我知道 let
和 var
变量定义的区别。奥特莱斯也一样吗?怎么才能看出outlet
let
:
let
Swift 中的关键字用于声明常量值,并且一旦定义就永远不能更改。
let name ="Kirit"
在你可以更改 name = "Modi"
之后你会遇到编译器错误。所以使用 let
关键字只声明一次它的值。
var
:
var
关键字在Swift中是可变的,用于声明变量值。该值可以在 运行 时间更改。这意味着可以更改太多次。
var name = "Kirit"
您可以更改 name = "Modi"
然后成功更新变量值。
在您的示例中,您正在考虑使用 var
与 let
来声明 属性 本身,以及在初始化 属性 的闭包内部.在回答您的问题时,最重要的是,在任何可以使用 let
(用于常量)的地方,理论上您可以使用 var
(用于变量),但只有在计划更改时才应该这样做那个变量稍后。对于引用类型,例如 UILabel
,这意味着如果您计划用 UILabel
.
因此,第一个和第四个选项(其中 var
在闭包内部使用)可以立即被视为糟糕的编程风格,因为您不会在闭包范围内再次更改它,所以我们知道我们应该在闭包中使用 let
。关于第二个或第三个选项(即 属性 本身应该是常数还是变量),问题是您是否打算稍后用另一个替换 UILabel
。如果是这样,您必须使用第三个选项。但我们可以怀疑这不太可能是您的意图,因此如果您不打算稍后更换该标签,那么在这四个选项中,您会倾向于第二个选项 let
/let
.
话虽如此,这看起来像是在视图控制器中,我不建议在视图控制器实例化期间实例化任何视图对象。通常这会推迟到 viewDidLoad
,或者如果整个视图层次结构都是以编程方式构建的,则在 loadView
中。或者,更好的是,我们摆脱了手动构建控件的业务,让故事板在适当的时间实例化 IBOutlet
引用。