2015-06-08 14 views
1

我想弄清楚爲什麼我在Xcode 6.3.2中使用這種類型的構造時遇到了不斷的編譯問題。Xcode6.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沒有成員CONSTANT_NAME 「

如果我很幸運並且強迫它清理,然後重建它,有時候會自行排序並工作。其他時候,即使這樣做,然後嘗試打開/關閉項目仍然不能解決問題。所以,我想我的隱式後續問題(如果上述答案是 - 它是合法代碼):是Xcode Swift編譯器,即使像這樣的基本事情可能會導致問題的錯誤?如果是這樣,斯威夫特似乎處於一個相當糟糕的狀態。

回答

5

static是類屬性,這意味着你必須這樣調用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你的代碼的工作,在Apple Documentation

+0

當我們考慮到Swift允許我們在這裏省略'self.'時(這在第二個例子中),這更加有意義。雖然,如果我們打算在課堂上使用這種常量,我認爲'靜態'仍然應該留在那裏。 – nhgrif

+0

非常感謝!我沒有注意到這本快速書中的要求。非常感激。 –

2

static let語法不使用static

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

更多細節合法有效。問題是,你必須完全限定該變量,當你訪問它:

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

編譯器錯誤是有點遲鈍,但它說的是實話...... CONSTANT_NAME不是成員,但類型屬性 Foo級:Swift Type Properties

+0

獅子座擊敗了我的答案;) –

+0

感謝您的答覆 - 以及對錯誤消息中細微含義的解釋。似乎很奇怪,雖然該實例字段獲得自動隱式範圍但靜態字段不?對靜態函數是否有類似的要求,或者它們是否自動作用域?編譯器有時會允許它編譯也是奇怪的 - 有時候它不會。 –

0

我聽說過關於保存擊鍵的問題。我個人一直試圖讓我的雨燕代碼習慣地通過每一個捷徑擠奶但是當你發現這樣的代碼,你應該編譯器要求你保持在安全方面是高興:

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()) 
+0

感謝您的評論!我來自Java背景(也許它顯示),所以我不清楚靜態(類型)字段的隱式範圍是否必然是危險的,但我會接受它是一種風格,並與它一起滾動。也許這就是objective-c的工作方式,他們只是保持一致? –