2015-06-15 8 views
5

Rozumiem, że od Xcode 6.3/Swift 1.2 mogę używać zmiennych statycznych i metod wewnątrz klasy. Jednak kompilatorowi się to nie podoba, gdy próbuję zainicjować zmienną statyczną, wywołując funkcję statyczną (w poniższym przykładzie pojawia się błąd "Używanie nierozwiązanego identyfikatora getDefaultString"). Oto fragment, który pokazuje mój problem:Dlaczego nie mogę zainicjować zmiennej statycznej, wywołując funkcję statyczną w Swift?

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 } 
    } 
} 

Czy ktoś może mi pomóc zrozumieć, dlaczego nie mogę tego zrobić?

+0

Czy to działa, jeśli używasz 'private static var _server = Settings.getDefaultString (" DefaultServer ")'? – NobodyNada

+1

W rzeczywistości to robi. Ale nie rozumiem, dlaczego? – markdb314

Odpowiedz

11

To powinno działać:

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

Nie wiem dokładnie dlaczego, wydaje się, że istnieje jakiś założeniu w sztuce, że metoda bez typu kwalifikowanego przed Jest to metoda instancji. Ale to nie działa w pełni. Na przykład. daje to interesujący wynik na placu zabaw:

class Foo { 

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

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

     static var foo: String = initFoo() 

    } 

    Foo.foo 

... nie trzeba kwalifikować typu przed initFoo(), ale wciąż jest on odbierany. Prawdopodobnie drobny błąd.

0

Wymuszasz rozwinięcie możliwego (i rzeczywistego) obiektu nil.

return _bundle.objectForInfoDictionaryKey(key) as! String 

NSBundle „s objectForInfoDictionaryKey może powrócić nil - swoją deklarację:

func objectForInfoDictionaryKey(key: String) -> AnyObject? 

mój zmienił, jako plac zabaw:

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 

Można, oczywiście, awaryjne z nil w inny sposób, jeśli wolisz.

Powiązane problemy