私のObjective-Cプロジェクトでは、通知名やNSUserDefaults
のキーなどを格納するためにグローバル定数ファイルを使うことがよくあります。それはこのようになります:
@interface GlobalConstants : NSObject
extern NSString *someNotification;
@end
@implementation GlobalConstants
NSString *someNotification = @"aaaaNotification";
@end
Swiftでまったく同じことをするにはどうすればいいですか?
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
を使うことができます
パーティーに遅刻する
ここでは、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
@ Francescuの方法(静的プロパティを持つ構造体を使用)をお勧めしますが、グローバル定数と変数を定義することもできます。
let someNotification = "TEST"
ただし、ローカル変数/定数およびクラス/構造体のプロパティとは異なり、グローバルは暗黙的に遅延するため、最初にアクセスしたときにグローバルが初期化されます。
推奨される読み方: グローバル変数とローカル変数 、および Swiftのグローバル変数は変数ではありません
Constant.Swift
import Foundation
let kBaseURL = NSURL(string: "http://www.example.com/")
ViewController.Swift
var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
列挙を検討してください。これらは別々のユースケースのために論理的に分割することができます。
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
のケースを処理していないため、コンパイルエラーが発生します。
またはGlobalConstants.Swiftだけで:
import Foundation
let someNotification = "aaaaNotification"
他の人がクラスの外側で宣言されたものはグローバルであると述べたように。
シングルトンを作成することもできます。
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
を使用してクラスのすべての値をアドレス指定します。
私の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"
}
通知には拡張子を使うことができます。
extension Notification.Name {
static let testNotification = "kTestNotification"
}
そしてNotificationCenter.default.post(name: .testNotification, object: nil)
のようにそれを使ってください
Swiftのドキュメントによると グローバル変数はファイルスコープで宣言されています。
グローバル変数は、関数、メソッド、クロージャ、または型コンテキストの外側で定義されている変数です。
Swiftファイル(E.g:Constnats.Swift)を作成して、そこで定数を宣言するだけです。
// Constants.Swift
let SOME_NOTIF = "aaaaNotification"
また、構造体、列挙型、クラス名などを指定しなくても、プロジェクト内のどこからでも呼び出せます。
// MyViewController.Swift
NotificationCenter.default.post(name: SOME_NOTIF, object: nil)
私はこれがコードの読みやすさのためにはるかに良いと思います。
私のアプリケーションでグローバル定数を持つために、これは私が別の 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)
色
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
}
}
他の人のために - すべてが受け入れられた答えと同じです。
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"
}