当我们在 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
    }

一切正常。有什么不同吗?希望你能帮助理解这一点。

我知道 letvar 变量定义的区别。奥特莱斯也一样吗?怎么才能看出outlet

的区别

let: let Swift 中的关键字用于声明常量值,并且一旦定义就永远不能更改。

let name ="Kirit" 

在你可以更改 name = "Modi" 之后你会遇到编译器错误。所以使用 let 关键字只声明一次它的值。

var : var关键字在Swift中是可变的,用于声明变量值。该值可以在 运行 时间更改。这意味着可以更改太多次。

var name = "Kirit" 

您可以更改 name = "Modi" 然后成功更新变量值。

在您的示例中,您正在考虑使用 varlet 来声明 属性 本身,以及在初始化 属性 的闭包内部.在回答您的问题时,最重要的是,在任何可以使用 let (用于常量)的地方,理论上您可以使用 var (用于变量),但只有在计划更改时才应该这样做那个变量稍后。对于引用类型,例如 UILabel,这意味着如果您计划用 UILabel.

的全新实例替换该标签

因此,第一个和第四个选项(其中 var 在闭包内部使用)可以立即被视为糟糕的编程风格,因为您不会在闭包范围内再次更改它,所以我们知道我们应该在闭包中使用 let 。关于第二个或第三个选项(即 属性 本身应该是常数还是变量),问题是您是否打算稍后用另一个替换 UILabel。如果是这样,您必须使用第三个选项。但我们可以怀疑这不太可能是您的意图,因此如果您不打算稍后更换该标签,那么在这四个选项中,您会倾向于第二个选项 let/let .


话虽如此,这看起来像是在视图控制器中,我不建议在视图控制器实例化期间实例化任何视图对象。通常这会推迟到 viewDidLoad,或者如果整个视图层次结构都是以编程方式构建的,则在 loadView 中。或者,更好的是,我们摆脱了手动构建控件的业务,让故事板在适当的时间实例化 IBOutlet 引用。