Ios 在Swift中,有没有一种方法可以通过编程方式添加子视图,这样我就可以在整个类中使用,而不必使用可选属性?
通常,当我使用自定义视图自己的子视图创建自定义视图时,它看起来像这样:Ios 在Swift中,有没有一种方法可以通过编程方式添加子视图,这样我就可以在整个类中使用,而不必使用可选属性?,ios,swift,initialization,standards,optional,Ios,Swift,Initialization,Standards,Optional,通常,当我使用自定义视图自己的子视图创建自定义视图时,它看起来像这样: class MyView : UIView { var myButton : UIButton? var myLabel : UILabel? override init(frame: CGRect) { super.init(frame: frame) //Create the frames and such myButton = UIBut
class MyView : UIView {
var myButton : UIButton?
var myLabel : UILabel?
override init(frame: CGRect) {
super.init(frame: frame)
//Create the frames and such
myButton = UIButton(frame: myButtonsFrame)
myLabel = UILabel(frame: myLabelsFrame)
}
// Do other things
}
这在技术上是可行的,但它似乎违反了Swift中optionals的整个概念。因为我的子视图总是被创建的,所以它们不应该有?
s
但是,因为它们是,我经常被迫检查它们是否为零或强制展开,即使我知道它们永远不应该是零,如果是,它们应该在初始化中失败
有更好的方法吗?是的,只需切换代码即可:
class MyView : UIView {
var myButton : UIButton
var myLabel : UILabel
override init(frame: CGRect) {
myButton = UIButton(frame: myButtonsFrame)
myLabel = UILabel(frame: myLabelsFrame)
super.init(frame: frame)
}
// Do other things
}
在调用super.init
之前,您只需确保所有存储的属性都已初始化
或者,您可以将属性声明为隐式展开的选项,如UILabel代码>和ui按钮代码>如果您在第一次尝试访问它们上的任何属性或函数之前100%确保它们设置了值
请注意,@tmpz在评论中所说的是正确的-如果您不打算在init
之后更改属性值,您可能希望使用let
而不是var
将属性声明为常量。是的,只需切换代码即可:
class MyView : UIView {
var myButton : UIButton
var myLabel : UILabel
override init(frame: CGRect) {
myButton = UIButton(frame: myButtonsFrame)
myLabel = UILabel(frame: myLabelsFrame)
super.init(frame: frame)
}
// Do other things
}
在调用super.init
之前,您只需确保所有存储的属性都已初始化
或者,您可以将属性声明为隐式展开的选项,如UILabel代码>和ui按钮代码>如果您在第一次尝试访问它们上的任何属性或函数之前100%确保它们设置了值
请注意@tmpz在评论中所说的是正确的-如果您不打算在init
之后更改属性的值,您可能希望使用let
而不是var
将属性声明为常量。如果您不玩,请使用let来重新分配变量。那么如果我想通过功能?示例:myButton=getUIButton()
@FlaqueDeau,只要该函数不在同一对象上,这不是问题-如果函数是MyView
的成员函数,那么第一个选项就不走运了,必须使用第二个选项。因此,创建我的子视图而不使用很长的init函数的唯一方法是创建创建创建视图子视图的单独对象吗?@FlaqueDeau另一种方法是使用类助手{class func getUIButton()->UIButton{…}
如果不播放,请使用let来重新分配变量。那么如果我想通过函数创建子视图,该怎么办?示例:myButton=getUIButton()
@FlaqueDeau,只要该函数不在同一对象上,这不是问题-如果函数是MyView
的成员函数,那么第一个选项就不走运了,必须使用第二个选项。因此,创建我的子视图而不使用很长的init函数的唯一方法是创建创建创建视图子视图的单独对象吗?@FlaqueDeau另一种方法是使用例如类帮助程序{class func getUIButton()->UIButton{…}