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{…}