【问题标题】:Swift: Why the non-static methods can't call static variables and constant (static let) without dynamicType?Swift:为什么非静态方法不能在没有动态类型的情况下调用静态变量和常量(静态让)?
【发布时间】:2016-08-01 08:07:24
【问题描述】:

在使用 swift 之后,它破坏了我对静态变量和常量的看法。

为什么swift不允许我们在其他方法中调用静态变量和常量?

例如:

class Aa {
    static let name = "Aario"
    func echo() {
        print(name)      // Error!
    } 
}

先生。食人魔告诉我使用dynamicType

class Aa {
    static var name = "Aario"
    func echo() {
        print(self.dynamicType.name)
    }
}

let a = Aa()
a.dynamicType.name = "Aario Ai"   
a.echo()                         // it works!!!

有效!那么为什么要使用dynamicType来调用静态变量呢?

最后,答案是:

class Aa {
    static var name = "Static Variable"
    var name = "Member Variable"
    func echo() {
        print(self.dynamicType.name)    // Static Variable
        print(Aa.name)                  // Static Variable
        print(name)                     // Member Variable
    }
}

let a = Aa()
a.dynamicType.name = "Aario Ai"   
Aa.name = "Static: Aario"
a.name = "Member: Aario"
a.echo()                         // it works!!!

这和其他语言真的不一样。

【问题讨论】:

  • 使用 self.dynamictype.name
  • 你是对的。你能告诉我为什么它与其他语言有很大不同吗?
  • 您可以同时拥有一个实例属性和一个同名的类型(类/静态)属性。

标签: swift swift2 constants static-members dynamictype


【解决方案1】:

静态变量必须使用它们的类型来处理,即使您在这种类型中编写代码也是如此。见The Swift Programming Language (Swift 2.2) - Properties(在“查询和设置类型属性”中):

类型属性使用点语法进行查询和设置,就像实例属性一样。但是,类型属性是在类型上查询和设置的,而不是在该类型的实例上。

在您的代码中,只需写 Aa.name 而不是 name 就可以了。

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2011-07-11
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多