斯威夫特,两个问题。 1)弱变量2)@IBOutlet的bang运算符

时间:2015-03-12 19:03:48

标签: swift operators automatic-ref-counting iboutlet

每:

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

  2. 为什么在UILabel结束时会有一个爆炸操作员。我知道这是必需的,我和它一起去,但现在就问它。

  3. 提前致谢。

4 个答案:

答案 0 :(得分:21)

  1. 默认情况下,Swift IBOutlet很弱(但默认情况下其他属性很强)。所以写作都是一样的。
  2. 您有关于弱{strong} here

    之间差异的详细信息
    1. 根据apple documentation
    2.   

      当你在Swift中声明一个插座时,你应该制作一个类型的   出口一个隐含的未包装的可选(!)。这样,你就可以了   故事板在初始化后在运行时连接出口。

答案 1 :(得分:10)

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

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

答案 2 :(得分:1)

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

someLabel.text = "some text"

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

@IBOutlet weak var someLabel: UILabel?

但访问时必须使用?

someLabel?.text = "some text"

答案 3 :(得分:1)

  1. @ gregheo的回答是最好的解释,进一步详细说明:如果你考虑在这种情况下的所有权,@IBOutlet引用的View对象通常不应该由视图控制器引用它。

    相反,它应该由其超级视图拥有,无论它在树中的哪个位置(由UIView.subviews强烈发生)。相反,View Controller强烈拥有它的View Tree的根(UIViewController.view)。 weak明确声明了一个非拥有引用,它可能在View Controller的生命中的不同点变为零。

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

    此外,@IBOutlet是一个功能强大的工具,可在设计屏幕或视图时实现灵活,视觉上集中的方法。通常的做法是让View Controller公开@IBOutlet以获取它可用的所有信息,无论是否知道它将被使用,并单独决定在构建和迭代时实际连接和使用哪些信息。 Interface Builder中的视图。

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

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