it-swarm.com.de

Globale Konstantendatei in Swift

In meinen Objective-C-Projekten verwende ich häufig eine globale Konstantendatei, um Dinge wie Benachrichtigungsnamen und Schlüssel für NSUserDefaults zu speichern. Es sieht ungefähr so ​​aus:

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

Wie mache ich genau dasselbe in Swift?

314
user1028028

IMO ist der beste Weg, mit dieser Art von Konstanten umzugehen, ein Struct zu erstellen.

struct Constants {
    static let someNotification = "TEST"
}

Nennen Sie es dann beispielsweise so in Ihrem Code:

print(Constants.someNotification)

Bearbeiten: Wenn Sie eine bessere Organisation wünschen, empfehle ich Ihnen, segmentierte Unterstrukturen zu verwenden

struct K {
    struct NotificationKey {
        static let Welcome = "kWelcomeNotif"
    }

    struct Path {
        static let Documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        static let Tmp = NSTemporaryDirectory()
    }
}

Dann können Sie einfach zum Beispiel K.Path.Tmp verwenden.

726
Francescu

Ich komme zu spät zur Party.

Egal, wie ich die Konstantendatei verwalte, damit es für Entwickler sinnvoller ist, Code in Swift zu schreiben.

FÜR URL:

//URLConstants.Swift

  struct APPURL {

    private struct Domains {
        static let Dev = "http://test-dev.cloudapp.net"
        static let UAT = "http://test-UAT.com"
        static let Local = "192.145.1.1"
        static let QA = "testAddress.qa.com"
    }

    private  struct Routes {
        static let Api = "/api/mobile"
    }

    private  static let Domain = Domains.Dev
    private  static let Route = Routes.Api
    private  static let BaseURL = Domain + Route

    static var FacebookLogin: String {
        return BaseURL  + "/auth/facebook"
    }
}

Für CUSTOMFONTS:

//FontsConstants.Swift
struct FontNames {

    static let LatoName = "Lato"
    struct Lato {
        static let LatoBold = "Lato-Bold"
        static let LatoMedium = "Lato-Medium"
        static let LatoRegular = "Lato-Regular"
        static let LatoExtraBold = "Lato-ExtraBold"
    }
}

FÜR ALLE IN APP VERWENDETEN KEYS

//KeyConstants.Swift
    struct Key {

        static let DeviceType = "iOS"
        struct Beacon{
            static let ONEXUUID = "xxxx-xxxx-xxxx-xxxx"
        }

        struct UserDefaults {
            static let k_App_Running_FirstTime = "userRunningAppFirstTime"
        }

        struct Headers {
            static let Authorization = "Authorization"
            static let ContentType = "Content-Type"
        }
        struct Google{
            static let placesKey = "some key here"//for photos
            static let serverKey = "some key here"
        }

        struct ErrorMessage{
            static let listNotFound = "ERROR_LIST_NOT_FOUND"
            static let validationError = "ERROR_VALIDATION"
        }
    }

FÜR FARBKONSTANTE:

//ColorConstants.Swift
struct AppColor {

    private struct Alphas {
        static let Opaque = CGFloat(1)
        static let SemiOpaque = CGFloat(0.8)
        static let SemiTransparent = CGFloat(0.5)
        static let Transparent = CGFloat(0.3)
    }

    static let appPrimaryColor =  UIColor.white.withAlphaComponent(Alphas.SemiOpaque)
    static let appSecondaryColor =  UIColor.blue.withAlphaComponent(Alphas.Opaque)

    struct TextColors {
        static let Error = AppColor.appSecondaryColor
        static let Success = UIColor(red: 0.1303, green: 0.9915, blue: 0.0233, alpha: Alphas.Opaque) 
    }

    struct TabBarColors{
        static let Selected = UIColor.white
        static let NotSelected = UIColor.black
    }

    struct OverlayColor {
        static let SemiTransparentBlack = UIColor.black.withAlphaComponent(Alphas.Transparent)
        static let SemiOpaque = UIColor.black.withAlphaComponent(Alphas.SemiOpaque)
        static let demoOverlay = UIColor.black.withAlphaComponent(0.6)
    }
}

Sie können diese Dateien in eine gemeinsame Gruppe mit dem Namen Konstanten in Ihrem Xcode-Projekt einschließen.

Und für mehr schau dir das an Video

95
LC 웃

Obwohl ich @ Francescus Methode bevorzuge (mit einer Struktur mit statischen Eigenschaften), können Sie auch globale Konstanten und Variablen definieren:

let someNotification = "TEST"

Beachten Sie jedoch, dass Globale im Gegensatz zu lokalen Variablen/Konstanten und Klassen-/Struktureigenschaften implizit faul sind. Dies bedeutet, dass sie beim ersten Zugriff initialisiert werden.

Empfohlene Lektüre: globale und lokale Variablen und auch globale Variablen in Swift sind keine Variablen

28
Antonio

Constant.Swift

import Foundation

let kBaseURL = NSURL(string: "http://www.example.com/")

ViewController.Swift

var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
20
Kirit Vaghela

Betrachten Sie Aufzählungen. Diese können für separate Anwendungsfälle logisch aufgeteilt werden.

enum UserDefaultsKeys: String {
    case SomeNotification = "aaaaNotification"
    case DeviceToken = "deviceToken"
}

enum PhotoMetaKeys: String {
    case Orientation = "orientation_hv"
    case Size = "size"
    case DateTaken = "date_taken"
}

Ein einzigartiger Vorteil ergibt sich, wenn Sie sich gegenseitig ausschließende Optionen haben, wie z.

for (key, value) in photoConfigurationFile {
    guard let key = PhotoMetaKeys(rawvalue: key) else {
        continue // invalid key, ignore it
    }
    switch (key) {
    case.Orientation: {
        photo.orientation = value
    }
    case.Size: {
        photo.size = value
    }
    }
}

In diesem Beispiel erhalten Sie einen Kompilierungsfehler, weil Sie den Fall von PhotoMetaKeys.DateTaken nicht behandelt haben.

19

Oder einfach in GlobalConstants.Swift:

import Foundation

let someNotification = "aaaaNotification"
14
ChikabuZ

Wie andere erwähnt haben, ist alles, was außerhalb einer Klasse deklariert wird, global.

Sie können auch Singletons erstellen:

class TestClass {
    static let sharedInstance = TestClass()
    // Anything else goes here
    var number = 0
}

Wenn Sie etwas aus dieser Klasse verwenden möchten, z. schreiben:

TestClass.sharedInstance.number = 1

Wenn Sie jetzt an einer beliebigen Stelle in Ihrem Projekt println(TestClass.sharedInstance.number) schreiben, drucken Sie 1 in das Protokoll. Dies funktioniert für alle Arten von Objekten.

tl; dr: Wenn Sie alles in einer Klasse global machen möchten, fügen Sie der Klasse static let sharedInstance = YourClassName() hinzu und adressieren Sie alle Werte der Klasse mit dem Präfix YourClassName.sharedInstance

7
Jacob R

Was ich in meinem Swift Projekt getan habe
1: Neue Swift Datei erstellen
2: Erstellen Sie eine Struktur und eine statische Konstante darin.
3: Verwenden Sie zur Verwendung einfach YourStructName.baseURL

Hinweis: Nach dem Erstellen dauert die Initialisierung nur wenig, sodass sie nach 2-5 Sekunden in anderen Ansichts-Controllern angezeigt wird.

import Foundation

    struct YourStructName {
    static let MerchantID = "XXX"
    static let MerchantUsername = "XXXXX"
    static let ImageBaseURL = "XXXXXXX"
    static let baseURL = "XXXXXXX"
    }
5

Für Benachrichtigungen können Sie die folgende Erweiterung verwenden:

extension Notification.Name {
    static let testNotification = "kTestNotification"
}

Und benutze es wie NotificationCenter.default.post(name: .testNotification, object: nil)

2
B. Shoe

Gemäß Swift docs werden globale Variablen im Dateibereich deklariert.

Globale Variablen sind Variablen, die außerhalb eines Funktions-, Methoden-, Schließungs- oder Typkontexts definiert sind

Erstellen Sie einfach eine Swift -Datei (z. B. Constnats.Swift) und deklarieren Sie Ihre Konstanten dort:

// Constants.Swift

let SOME_NOTIF = "aaaaNotification"

und rufen Sie es von überall in Ihrem Projekt auf, ohne dass Sie Struktur, Aufzählung oder Klassennamen angeben müssen.

// MyViewController.Swift

NotificationCenter.default.post(name: SOME_NOTIF, object: nil)

Ich denke, das ist viel besser für die Lesbarkeit von Code.

1
Seif Meddeb

Um globale Konstanten in meinen Apps zu haben, mache ich das in einer separaten Swift Datei:

import Foundation

struct Config {
    static let baseURL = "https://api.com"

    static APIKeys {
        static let token = "token"
        static let user = "user"
    }

    struct Notifications {
        static let awareUser = "aware_user"
    }
}

Es ist einfach zu bedienen und überall so anzurufen:

print(Config.Notifications.awareUser)
1
Ale Mohamad

Farben

extension UIColor {
    static var greenLaPalma: UIColor {
        return UIColor(red:0.28, green:0.56, blue:0.22, alpha:1.00)
    }
}

Schriften

enum CustomFontType: String {
    case avenirNextRegular = "AvenirNext-Regular",
    avenirDemiBold = "AvenirNext-DemiBold"
}

extension UIFont {
    static func getFont(with type: CustomFontType, size: CGFloat) -> UIFont {
        let font = UIFont(name: type.rawValue, size: size)!

        return font
    }
}

Für andere - alles das gleiche wie in der akzeptierten Antwort.

1
Bohdan Savych

Swift 4 Version

Wenn Sie einen Namen für NotificationCenter erstellen möchten:

extension Notification.Name {
    static let updateDataList1 = Notification.Name("updateDataList1")
}

Benachrichtigungen abonnieren:

NotificationCenter.default.addObserver(self, selector: #selector(youFunction), name: .updateDataList1, object: nil)

Benachrichtigung senden:

NotificationCenter.default.post(name: .updateDataList1, object: nil)

Wenn Sie nur eine Klasse mit Variablen verwenden möchten:

class Keys {
    static let key1 = "YOU_KEY"
    static let key2 = "YOU_KEY"
}

Oder:

struct Keys {
    static let key1 = "YOU_KEY"
    static let key2 = "YOU_KEY"
}
0
Valeriy