web-dev-qa-db-ja.com

Swiftのグローバル定数ファイル

私のObjective-Cプロジェクトでは、通知名やNSUserDefaultsのキーなどを格納するためにグローバル定数ファイルを使うことがよくあります。それはこのようになります:

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

Swiftでまったく同じことをするにはどうすればいいですか?

303
user1028028

IMOがこの種の定数を扱う最も良い方法は、Structを作成することです。

struct Constants {
    static let someNotification = "TEST"
}

それから、例えば、あなたのコードでこのようにそれを呼び出します:

print(Constants.someNotification)

編集:あなたがより良い組織がほしいならば、私はあなたにセグメント化された下位構造を使うことを勧めます

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

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

それならあなたはただK.Path.Tmpを使うことができます

713
Francescu

パーティーに遅刻する

ここでは、Swiftでコードを書くときに開発者にとってより意味のあるものにするために、定数ファイルをどのように管理するかは関係ありません。

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

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

APPで使用されるすべてのキーについて

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

色定数の場合:

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

Xcodeプロジェクトでは、これらすべてのファイルを Constants という名前の共通グループにまとめることができます。

そしてもっと見るためにこれ video

91
LC 웃

@ Francescuの方法(静的プロパティを持つ構造体を使用)をお勧めしますが、グローバル定数と変数を定義することもできます。

let someNotification = "TEST"

ただし、ローカル変数/定数およびクラス/構造体のプロパティとは異なり、グローバルは暗黙的に遅延するため、最初にアクセスしたときにグローバルが初期化されます。

推奨される読み方: グローバル変数とローカル変数 、および Swiftのグローバル変数は変数ではありません

28
Antonio

Constant.Swift

import Foundation

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

ViewController.Swift

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

列挙を検討してください。これらは別々のユースケースのために論理的に分割することができます。

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

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

次のような相互に排他的なオプションの状況がある場合、1つのユニークな利点があります。

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

この例では、PhotoMetaKeys.DateTakenのケースを処理していないため、コンパイルエラーが発生します。

18

またはGlobalConstants.Swiftだけで:

import Foundation

let someNotification = "aaaaNotification"
14
ChikabuZ

他の人がクラスの外側で宣言されたものはグローバルであると述べたように。

シングルトンを作成することもできます。

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

このクラスの何かを使いたいときはいつでも。書きます:

TestClass.sharedInstance.number = 1

プロジェクトのどこからでもprintln(TestClass.sharedInstance.number)を書いた場合は、ログに1を出力します。これはあらゆる種類のオブジェクトに対して機能します。

tl; dr: クラス内のすべてのものをグローバルにする場合は、クラスにstatic let sharedInstance = YourClassName()を追加し、プレフィックスYourClassName.sharedInstanceを使用してクラスのすべての値をアドレス指定します。

7
Jacob R

私のSwiftプロジェクトでしたこと
1:新しいSwiftファイルを作成する
2:その中に構造体と静的定数を作成します。
3:使用する場合は、YourStructName.baseURLを使用してください。

注意:初期化後の初期化には少し時間がかかるので、2〜5秒後に他のビューコントローラに表示されます。

import Foundation

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

通知には拡張子を使うことができます。

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

そしてNotificationCenter.default.post(name: .testNotification, object: nil)のようにそれを使ってください

2
B. Shoe

Swiftのドキュメントによると グローバル変数はファイルスコープで宣言されています。

グローバル変数は、関数、メソッド、クロージャ、または型コンテキストの外側で定義されている変数です。

Swiftファイル(E.g:Constnats.Swift)を作成して、そこで定数を宣言するだけです。

// Constants.Swift

let SOME_NOTIF = "aaaaNotification"

また、構造体、列挙型、クラス名などを指定しなくても、プロジェクト内のどこからでも呼び出せます。

// MyViewController.Swift

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

私はこれがコードの読みやすさのためにはるかに良いと思います。

1
Seif Meddeb

私のアプリケーションでグローバル定数を持つために、これは私が別の Swift ファイルですることです:

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

使い方は簡単で、どこにでも電話をかけることができます。

print(Config.Notifications.awareUser)
1
Ale Mohamad

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

フォント

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

他の人のために - すべてが受け入れられた答えと同じです。

1
Bohdan Savych

Swift 4バージョン

NotificationCenterの名前を作成したい場合は、次の手順を実行します。

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

通知を購読する:

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

通知を送る:

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

変数を持つクラスだけを使用したい場合は、

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

または

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