Xcode6.3.2带有静态常数的Swift错误

Xcode6.3.2带有静态常数的Swift错误,swift,static,static-members,Swift,Static,Static Members,我试图弄清楚为什么在Xcode 6.3.2中这种类型的构造会不断出现编译问题 class Foo { static let CONSTANT_NAME = "CONSTANT_STRING" ... func bar () -> String { var s = String(format:"%s,%d\n", CONSTANT_NAME, 7) return s } ... } 就我对语言的理解而言,这应该是完全合法的代码,但是Xcode经常(哈哈双

我试图弄清楚为什么在Xcode 6.3.2中这种类型的构造会不断出现编译问题

class Foo {
  static let CONSTANT_NAME = "CONSTANT_STRING"
  ...
  func bar () -> String {
    var s = String(format:"%s,%d\n", CONSTANT_NAME, 7)
    return s
  }
  ...
}
就我对语言的理解而言,这应该是完全合法的代码,但是Xcode经常(哈哈双关)出现问题,导致错误

“类Foo中没有成员常量\u名称”

如果我运气好,强迫它清理,然后重建,它有时会自行清理并工作。其他时候,即使这样做,尝试打开/关闭项目仍然无法解决问题


所以,我想我的后续问题(如果上面的答案是-这是法律代码)是:Xcode Swift编译器是否存在缺陷,即使是这样的基本问题也可能导致问题?如果是这样的话,swift似乎处于非常糟糕的状态。

static
是class属性,这意味着您必须像这样调用它
ClassName.property

class Foo {
    static let CONSTANT_NAME = "CONSTANT_STRING"
    func bar () -> String {
        var s = String(format:"%s,%d\n", Foo.CONSTANT_NAME, 7)
        return s
    }
}
这不是一个错误。这就是它应该是的。类属性“属于”该类

如果希望代码不使用
ClassName
,请不要使用
static

class Foo {
    let CONSTANT_NAME = "CONSTANT_STRING"
    func bar () -> String {
        var s = String(format:"%s,%d\n",CONSTANT_NAME, 7)
        return s
    }
}

静态
中的更多细节是类属性,这意味着您必须像这样调用它
ClassName.property

class Foo {
    static let CONSTANT_NAME = "CONSTANT_STRING"
    func bar () -> String {
        var s = String(format:"%s,%d\n", Foo.CONSTANT_NAME, 7)
        return s
    }
}
这不是一个错误。这就是它应该是的。类属性“属于”该类

如果希望代码不使用
ClassName
,请不要使用
static

class Foo {
    let CONSTANT_NAME = "CONSTANT_STRING"
    func bar () -> String {
        var s = String(format:"%s,%d\n",CONSTANT_NAME, 7)
        return s
    }
}

静态let
语法中的更多详细信息是合法有效的。问题是,在访问该变量时,必须完全限定该变量:

var s = String(format:"%s,%d\n", Foo.CONSTANT_NAME, 7)

编译器错误有点迟钝,但它说的是实话
CONSTANT\u NAME
不是成员,而是类Foo的类型属性:

静态let语法合法有效。问题是,在访问该变量时,必须完全限定该变量:

var s = String(format:"%s,%d\n", Foo.CONSTANT_NAME, 7)

编译器错误有点迟钝,但它说的是实话
CONSTANT\u NAME
不是一个成员,而是Foo类的类型属性:

我听说了关于保存按键笔划的内容。我个人一直在努力使我的Swift代码尽可能地地道化,尽量走捷径,但当你发现这样的代码时,你应该很高兴编译器要求你保持安全:

class Foo {
    static let CONSTANT = "hello"

    func bar() -> String {
        let CONSTANT = "bye"
        return CONSTANT // I know which one! Thanks Swift!
    }
}
println(Foo.CONSTANT)
println(Foo().bar())

我听你说过要保存按键。我个人一直在努力使我的Swift代码尽可能地地道化,尽量走捷径,但当你发现这样的代码时,你应该很高兴编译器要求你保持安全:

class Foo {
    static let CONSTANT = "hello"

    func bar() -> String {
        let CONSTANT = "bye"
        return CONSTANT // I know which one! Thanks Swift!
    }
}
println(Foo.CONSTANT)
println(Foo().bar())

当我们想到Swift允许我们在这里省略
self.
(在第二个示例中)这一事实时,这就更有意义了。但是,如果我们打算在类外部使用这个常量,我认为
static
很可能仍然应该留在那里。非常感谢!我在swift手册中没有注意到这个要求。非常感谢。当我们考虑到Swift允许我们省略
self.
(在第二个示例中)这一事实时,这就更有意义了。但是,如果我们打算在类外部使用这个常量,我认为
static
很可能仍然应该留在那里。非常感谢!我在swift手册中没有注意到这个要求。非常感谢。利奥击败了我的答案;)感谢您的回复,以及对错误消息中微妙含义的解释。看起来很奇怪,虽然实例字段得到了自动隐式作用域,但静态字段没有?静态函数是否有类似的要求,或者它们是否自动确定范围?同样奇怪的是,编译器有时会允许它构建,而有时则不会感谢您的回复,以及对错误消息中微妙含义的解释。看起来很奇怪,虽然实例字段得到了自动隐式作用域,但静态字段没有?静态函数是否有类似的要求,或者它们是否自动确定范围?同样奇怪的是,编译器有时会允许它编译,有时则不会。谢谢你的评论!我来自Java背景(也许它显示了),所以我不清楚静态(类型)字段的隐式作用域有多危险,但我接受它的风格,并继续使用它。也许这就是objective-c的工作原理,它们只是保持一致?谢谢你的评论!我来自Java背景(也许它显示了),所以我不清楚静态(类型)字段的隐式作用域有多危险,但我接受它的风格,并继续使用它。也许这就是objective-c的工作原理,它们只是保持一致?