2015-06-15 27 views
5

Sono a conoscenza del fatto che da Xcode 6.3/Swift 1.2, posso usare variabili e metodi statici all'interno di una classe. Tuttavia, al compilatore non piace quando cerco di inizializzare una variabile statica chiamando una funzione statica (ho l'errore 'Use of ansolated identifier getDefaultString' nell'esempio sotto). Ecco uno snippet che dimostra il mio problema:Perché non posso inizializzare una variabile statica chiamando una funzione statica in 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 } 
    } 
} 

Qualcuno può aiutarmi a capire perché non posso farlo?

+0

Funziona se si utilizza 'static static var _server = Settings.getDefaultString (" DefaultServer ")'? – NobodyNada

+1

In effetti, lo fa. Ma non capisco perché? – markdb314

risposta

11

Questo dovrebbe funzionare:

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

Non so esattamente perché, sembra che ci sia una sorta di un presupposto nel gioco che un metodo senza tipo qualificato di fronte ad essa è un metodo di istanza. Ma non funziona perfettamente. Per esempio. questo produce risultato interessante nel parco giochi:

class Foo { 

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

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

     static var foo: String = initFoo() 

    } 

    Foo.foo 

... non c'è bisogno di qualificarsi tipo di fronte a initfoo(), ma ancora quello statico viene prelevato. Probabilmente un bug minore.

0

Si sta forzando uno scartare di un possibile (ed effettivo) oggetto nil.

return _bundle.objectForInfoDictionaryKey(key) as! String 

NSBundle s' objectForInfoDictionaryKey può tornare nil - sua dichiarazione:

func objectForInfoDictionaryKey(key: String) -> AnyObject? 

mia modifica, come un parco giochi:

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 

È possibile, naturalmente, fallback da un nil in qualche altro modo, se preferisci.

Problemi correlati