簡體   English   中英

為什么我不能通過在Swift中調用靜態函數來初始化靜態變量?

[英]Why can't I initialize a static variable by calling a static function in Swift?

據我所知,從Xcode 6.3 / Swift 1.2開始,我可以在類中使用靜態變量和方法。 但是,當我嘗試通過調用靜態函數初始化靜態變量時,編譯器不喜歡它(我在下面的示例中得到錯誤'使用未解析的標識符getDefaultString')。 這是一個演示我的問題的片段:

import Foundation

public class Settings {
    private static var _bundle = NSBundle.mainBundle()
    static func getDefaultString(key: String) -> String {
        return _bundle.objectForInfoDictionaryKey(key) as! String
    }

    private static var _server = getDefaultString("DefaultServer")
    public class var server: String {
        get { return _server }
        set { _server = newValue }
    }
}

有人能幫助我理解為什么我不能這樣做嗎?

這應該工作:

private static var _server = Settings.getDefaultString("DefaultServer")

我不確切地知道為什么,似乎在游戲中存在某種假設,即在其前面沒有類型限定的方法是實例方法。 但這並不完全有效。 例如,這會在游樂場產生有趣的結果

    class Foo {

        static func initFoo() -> String {
            return "static"
        }

        func initFoo() -> String {
            return "instance"
        }

        static var foo: String = initFoo()

    }

    Foo.foo

...不需要在initFoo()前面限定類型,但仍然會選擇靜態類型。 可能是一個小錯誤。

你正在強制解開一個可能的(和實際的) nil對象。

return _bundle.objectForInfoDictionaryKey(key) as! String

NSBundleobjectForInfoDictionaryKey可以返回nil - 它的聲明:

func objectForInfoDictionaryKey(key: String) -> AnyObject?

我的編輯,作為一個操場:

import Foundation

class Settings {
    private static var _bundle = NSBundle.mainBundle()
    static func getDefaultString(key: String) -> String? {
        return _bundle.objectForInfoDictionaryKey(key) as? String
    }

    private static var _server = Settings.getDefaultString("DefaultServer")

    class var server: String? {
        get { return _server }
        set { _server = newValue }
    }
}

Settings.server

你可以,當然,從備用nil在一些其他的方式,如果你喜歡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM