Swift实例变量下划线前缀?

ma1*_*w28 12 swift

Swift是否删除了实例变量的下划线前缀约定,例如_window?如果是这样,为什么?

GoZ*_*ner 18

Apple仍然_在其Xcode样板代码中使用它作为non-public变量的约定.你会看到这样的模式:

class Foo {
  var _bar : Bar? = nil
  var  bar : Bar {
    if _bar == nil {
      /* compute some stuff */
      _bar = Bar (/* ... */)
    }
    return _bar!
  }
}
Run Code Online (Sandbox Code Playgroud)

其中对属性的访问是通过bar计算属性进行的.您可以在Apple CoreData模板中找到它.


zum*_*zum 14

在Objective-C中,当你声明一个属性@synthesize时会自动为clang 3.2创建getter和setter.因此,属性"foo"的默认@synthesize将如下所示:

@synthesize foo = _foo

因为_foo将是iVar.换句话说,你可以自己完成@synthesize,无论你喜欢什么,都可以调用iVar:

@synthesize foo = myiVarFoo

所以在这种情况下没有"_"

所以现在在文档中使用Swift :

Swift将这些概念统一到一个属性声明中.Swift属性没有相应的实例变量,并且不直接访问属性的后备存储.

因此,从文档中可以清楚地看出,swift没有相应的实例变量,因此不再需要"_".


Gab*_*lla 6

下划线前缀意味着不要将实例变量_foo与其getter 混淆foo.

在快速的情况下,伊娃与吸气剂之间并没有这样的区别.相反,你只有属性,使得_约定不必要.

  • 仍然存在私有财产(理想情况下与吸气剂同名)可能有用的情况.由于无法覆盖存储的属性,因此拥有一个提供存根方法的超类(如foo())可能很有用,必须由子类重写.子类方法可能只返回_foo. (6认同)