【问题标题】:Swift, two issues. 1) weak var 2) bang operator for @IBOutlet斯威夫特,两个问题。 1) 弱变量 2) @IBOutlet 的 bang 运算符
【发布时间】:2015-05-15 02:32:52
【问题描述】:

每人:

@IBOutlet weak var nameLabel: UILabel!
  1. 每当我声明我的 IBOutlets 时,我只使用 var 而不是弱 var。但是我最近遇到了一些使用弱 var 的代码模板。他们为什么这样做?额外的好处是什么?

  2. 为什么在 UILabel 的末尾有一个 bang 运算符。我知道这是必需的,我会继续使用它,但现在就问它。

提前致谢。

【问题讨论】:

标签: swift operators automatic-ref-counting iboutlet


【解决方案1】:
  1. Swift IBOutlet 默认情况下是弱的(但其他属性默认情况下是强的)。所以两者的写法是一样的。

你有更多关于弱与强的区别here

  1. 根据apple documentation

当你在 Swift 中声明一个 outlet 时,你应该指定 出口隐式展开的可选(!)。这样,您可以让 故事板在初始化后在运行时连接插座。

【讨论】:

    【解决方案2】:

    出口很弱,因为视图元素(强)由视图拥有。我认为你的视图控制器也有一个强大的参考在技术上是可以的,但不是必需的。

    弱变量是可选的,因为它们可以是nil。您可以改为使用? 声明您的出口,但这意味着每次都使用强制展开或可选绑定。使用 ! 将它们声明为隐式解包选项只是一种方便。

    【讨论】:

    • 干净简洁。
    【解决方案3】:

    您在引用 IBOutlets 时使用 weak,因为只要对象保留在其父视图中,就会有一个对其的强引用。见weak or strong for IBOutlets。 接下来,bang 运算符指示 IBOutlet 是一个显式展开的标签。使用 bang 操作符,它保证了对象会存在,所以在引用它的时候,你可以像这样简单地引用它:

    someLabel.text = "some text"
    

    但是,您可以将它们设为可选的 IBOutlets:

    @IBOutlet weak var someLabel: UILabel?
    

    但访问时必须使用?

    someLabel?.text = "some text"
    

    【讨论】:

    • 不保证隐式展开的选项不是nil。但是,@IBOutlets 将在调用 viewDidLoad 时被初始化
    • @Petter, @IBOutlets 在控制器上调用 awakeFromNib 之前被初始化。
    【解决方案4】:
    1. @gregheo 的回应是最好的解释,进一步详细说明:如果您在这种情况下考虑所有权,@IBOutlet 引用的 View 对象通常不应该由引用它的 View Controller 拥有。

      它应该由它的超级视图拥有,无论它在树中的什么位置(UIView.subviews 强烈发生这种情况)。相反,视图控制器强烈地拥有它的视图树的根 (UIViewController.view)。 weak 明确声明了一个非拥有引用,该引用可能在视图控制器生命周期的不同阶段变为 nil。

    2. 在这里,我将提供使用 ! 的替代方法:使用隐式展开的可选引用是一种危险的做法,它会削弱 Swift 为我们提供的工具。从 Xib 或 Storyboard 加载的视图控制器在其生命周期中包括在创建之后和加载视图之前的固定时间,其中 @IBOutlet 引用每次为零。假设在那段时间内没有人会对成员进行操作意味着不使用 Swift 语法和编译器的反馈对我们有利。

      此外,@IBOutlets 是一款功能强大的工具,可在设计屏幕或视图时采用灵活的、以视觉为重点的方法。通常的做法是让您的 View Controller 公开@IBOutlets 以获得所有可用信息,无论是否知道它将被使用,并单独决定在构建和迭代 View 时实际连接和使用哪个从界面生成器中。

      此外,如果您的视图应该足够灵活,可以从 Xib/Storyboard 和代码中实例化,这取决于您如何决定引用的子视图应该被实例化和连接,它们可能会或可能不会立即可用。

    由于上述原因,我定义了我的:@IBOutlet weak var nameLabel: UILabel?

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多