【问题标题】:Swift Variables InitializationSwift 变量初始化
【发布时间】:2017-03-20 11:56:50
【问题描述】:

我有一个关于 swift 变量初始化的问题。

我有两种方法来初始化变量(作为 Objective-C 中类的“属性”)。

哪一个是最正确的?

class Class {

  var label: UILabel!

  init() { ... label = UILabel() ... }

}

class Class {

  var label = UILabel()

  init() { … }

}

【问题讨论】:

  • 这不是正确性的问题。这是一个需求和代码样式的问题。如果计算出label 的值,您将使用第一个变体。如果该值类似于常量,您将倾向于第二种变体(并且可能使用let 而不是var)。但例外证明了规则。 ;)
  • @macmoonshine 我担心第二个是一种错误的方法。谢谢,现在我明白了:)

标签: ios swift variables initialization


【解决方案1】:

其实你有 5 种方法来初始化属性。

没有正确的方法,方法取决于需要。
基本上将像 UILabel 这样的对象声明为常量(如果可能的话)(let)。

这5种方式是:

  • 在声明行初始化

    let label = UILabel(frame:...
    
  • init 方法中初始化,您不必将属性声明为隐式解包可选。

    let label: UILabel
    init() { ... label = UILabel(frame:...) ... }
    

前两种方式实际上是相同的。

  • viewDidLoad 之类的方法中初始化,在这种情况下,您必须将属性声明为(隐式展开)可选并且还声明为var

    var label: UILabel!
    
    on viewDidLoad()
     ...
     label = UILabel(frame:...)
    }
    
  • 使用闭包进行初始化以分配默认(计算)值。闭包在类初始化时被调用一次,不能在闭包中使用类的其他属性。

    let label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo"
       return lbl
    }()
    
  • 使用闭包进行延迟初始化。第一次访问该属性时会调用(一次)闭包,您可以使用该类的其他属性。
    该属性必须声明为var

    let labelText = "Bar"
    
    lazy var label: UILabel = {
       let lbl = UILabel(frame:...)
       lbl.text = "Foo" + self.labelText
       return lbl
    }()
    

【讨论】:

  • let label: UILabel(frame:... = 而不是:
  • 感谢您的出色回答!)@vadian
【解决方案2】:

这两种方法都是正确的,但有时您应该使用init() 方法中的初始化。例如这里 barButton 的target 不会被设置,因为self 还不存在。

class Foo {
    var barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod))

    init(){
        //init here
    }
}

这种情况的正确方法是:

class Foo {
    var barButton : UIBarButton? 

    init(){
        barButton = UIBarButtonItem(title: "add", style: .Plain, target: self, action: #selector(self.someMethod))
    }
}

总而言之,这两种方式都是正确的,但你必须考虑何时使用每一种。 更多信息请关注Apple documentation

【讨论】:

    【解决方案3】:
     var label: UILabel! 
    

    以上语句的意思是,变量label可能为nil

    var label = UILabel()
    

    但在这里它将保存一个标签值。因为内存是为该变量分配的。所以它不会是零。

    请在此处找到更多详细信息

    What's the difference between var label: UILabel! and var label = UILabel( )?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2021-07-08
      相关资源
      最近更新 更多