静态成员不能在类型的实例上使用

and*_*ewz 34 swift

我正在尝试为单例创建一个访问方法.我收到此错误(请参阅下面的代码).我不明白为什么我会收到此错误以及此错误的含义.谁能解释一下?

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  static private var thedelegate: AppDelegate?

  class var delegate : AppDelegate {
    return thedelegate!
  }

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    thedelegate = self // syntax error: Static member 'thedelegate' cannot be used on instance of type 'AppDelegate'
Run Code Online (Sandbox Code Playgroud)

bjc*_*bjc 31

您需要在声明它的类名前面添加static/class变量或函数,即使在同一个类中也是如此.

在这种情况下,你想要 return AppDelegate.thedelegate!

而且,正如Martin R.指出的那样, AppDelegate.thedelegate = self

  • 它似乎不一致,因为如果你做一个let x = someStatic它在类的全局范围内工作,不需要前缀. (2认同)
  • @LegendLength 很少有语言似乎很有意义。'swift' 实际上比许多人做得更好(尽管这里有疑问;)) (2认同)

Sas*_*huk 23

您正尝试从该类的实例访问类级变量.要使用它,您需要创建类级别函数:static func().试试这个:

static func sharedDelegate() -> AppDelegate {
    return UIApplication.sharedApplication().delegate as! AppDelegate
}
Run Code Online (Sandbox Code Playgroud)

  • "您正在尝试从实例访问类级别参数" - 为什么我不能这样做? (17认同)
  • 啊,所以我根本没有给类var添加类名前缀,即AppDelegate.thedelegate = self.来自C++会让你头疼. (9认同)
  • @andrewz static将变量与类相关联,而不是类的实例.当你尝试:thedelegate = self.编译器尝试访问self.thedelegate.但它不在那里,如果它可能会有许多不同的代表.静态指令正好相反,所以我们只能为整个Class赋予该变量的值.希望有所帮助. (6认同)
  • 嗯,我做到了,但这并没有回答我的问题。它讨论了重写静态方法/属性与类方法/属性。我并不是想覆盖一个属性。我正在尝试从实例的方法中访问静态属性(“thedelegate”)。 (2认同)