2014-09-14 19 views
5

Non dovrebbe essere necessario creare un'istanza di una classe per accedere a una costante pubblica. Recentemente ho iniziato a lavorare in Swift, quindi mi manca qualcosa qui.swift - come accedere alle costanti pubbliche senza dover instanciare la classe, come in C#

In questo semplice esempio:

public class MyConstants{ 
    public let constX=1; 
} 
public class Consumer{ 
    func foo(){ 
      var x = MyConstants.constX;// Compiler error: MyConstants don't have constX 
    } 
} 

Questo codice foo dà un errore di compilazione. Per lavoro, ho bisogno di creare un'istanza dei MyConstants come questo:

public class Consumer{ 
    func foo(){ 
     var dummy = MyConstants(); 
     var x = dummy.constX; 
    } 
} 

Aggiunta statico per constX non è permesso.

risposta

16

Utilizzare struct con i tipi static. struct sono più appropriati come in enum è possibile associare solo un tipo di valori associativi ma è possibile contenere "Proprietà tipo di qualsiasi tipo" in entrambi.

public struct MyConstants{ 
    static let constX=1; 
} 
public class Consumer{ 
    func foo(){ 
     var x = MyConstants.constX; 
    } 
} 
+0

Accetto che una struttura sia più appropriata di una enumerazione, ma è possibile creare variabili immutabili statiche di diversi tipi di dati nelle enumerazioni – Antonio

+0

con' enum'. possiamo usare solo un tipo di valori associati in modo da non poter associare del tutto 'string' e' int'val con 'enums'. – codester

+0

Nella sua risposta personale, l'OP sta usando l'enum come contenitore per variabili statiche - prova questo: 'enum Constants {static let myConstant = 5; static let myData = "ciao"} ' – Antonio

0

Ho trovato la soluzione qui di seguito, ma spero che qualcuno può chiarire o inviare una soluzione migliore

enum MyConstantsV2 { 
    static var constX = 1 
} 

public class Consumerv2{ 

    func foo(){ 
     var x = MyConstantsV2.constX; 
    } 
} 
+0

'enum' non sono appropriati leggere la risposta – codester

5

Si dovrebbe usare variabili statiche immutabili. Sfortunatamente le classi supportano le proprietà calcolate solo con il modificatore class - il compilatore emette un errore affermando che le variabili di classe non sono eppure supportate.

Ma in struct è possibile creare membri dati statici:

struct Constants { 
    static let myConstant = 5 
} 

e, naturalmente, non è necessario per creare un'istanza, come la proprietà statica immutabile può essere semplicemente letta come:

Constants.myConstant 
2

Se si desidera una costante, si può anche "falso" la variabile di classe non ancora supportato con una proprietà di classe computerizzata, che non attualmente funziona:

public class MyConstants{ 
    public class var constX: Int { return 1 }; 
} 
public class Consumer{ 
    func foo(){ 
     var x = MyConstants.constX; // Now works fine. 
    } 
} 
1

Per costanti stringa quello che ho fare è mettere il gruppo di costanti nel file di classe responsabile nel modo seguente:

public enum NotificationMessage: String { 

    case kTimerNotificationId = "NotificationIdentifier" 
} 

Poi per l'utilizzo da qualsiasi altro punto del codice appena:

println("\(NotificationMessage.kTimerNotificationId.rawValue)") 

Non dimenticare .rawValue.

Problemi correlati