単純に、次のようにアプリケーション定数を保存する構造体があります。
struct Constant {
static let ParseApplicationId = "xxx"
static let ParseClientKey = "xxx"
static var AppGreenColor: UIColor {
return UIColor(hexString: "67B632")
}
}
これらの定数は、たとえばConstant.ParseClientKey
を呼び出すことにより、Swiftコードで使用できます。しかし、私のコードでは、Objective-Cクラスもいくつか含まれています。だから私の質問は、Objective-Cコードでこれらの定数をどのように使用するのですか?
定数を宣言するこの方法が適切でない場合、SwiftとObjective-Cコードの両方で使用されるグローバル定数を作成する最良の方法は何ですか?
悲しいことに、struct
もグローバル変数もObjective-Cに公開することはできません。 ドキュメント を参照してください。
今のところ、私見では、最善の方法は次のようなものです:
let ParseApplicationId = "xxx"
let ParseClientKey = "xxx"
let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)
@objc class Constant: NSObject {
private init() {}
class func parseApplicationId() -> String { return ParseApplicationId }
class func parseClientKey() -> String { return ParseClientKey }
class func appGreenColor() -> UIColor { return AppGreenColor }
}
Objective-Cでは、次のように使用できます。
NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];
struct
と@objc class
の両方を含むファイルを作成してみてください。次のようなものです。
import UIKit
extension UIColor {
convenience init(hex: Int) {
let components = (
R: CGFloat((hex >> 16) & 0xff) / 255,
G: CGFloat((hex >> 08) & 0xff) / 255,
B: CGFloat((hex >> 00) & 0xff) / 255
)
self.init(red: components.R, green: components.G, blue: components.B, alpha: 1)
}
}
extension CGColor {
class func colorWithHex(hex: Int) -> CGColorRef {
return UIColor(hex: hex).CGColor
}
}
struct Constant {
static let kParseApplicationId = "5678"
static let kParseClientKey = "1234"
static var kAppGreenColor: UIColor { return UIColor(hex:0x67B632) }
static var kTextBlackColor: UIColor { return UIColor(hex:0x000000) }
static var kSomeBgBlueColor: UIColor { return UIColor(hex:0x0000FF) }
static var kLineGrayCGColor: CGColor { return CGColor.colorWithHex(0xCCCCCC) }
static var kLineRedCGColor: CGColor { return CGColor.colorWithHex(0xFF0000) }
}
@objc class Constants: NSObject {
private override init() {}
class func parseApplicationId() -> String { return Constant.kParseApplicationId }
class func parseClientKey() -> String { return Constant.kParseClientKey }
class func appGreenColor() -> UIColor { return Constant.kAppGreenColor }
class func textBlackColor() -> UIColor { return Constant.kTextBlackColor }
class func someBgBlueColor() -> UIColor { return Constant.kSomeBgBlueColor }
class func lineGrayCGColor() -> CGColor { return Constant.kLineGrayCGColor }
class func lineRedCGColor() -> CGColor { return Constant.kLineRedCGColor }
}
Objective-Cファイルで使用するには、定数を使用する必要がある場合にこれを追加します。
#import "ProjectModuleName-Swift.h"
迅速な使用法:
self.view.backgroundColor = Constant.kAppGreenColor
Objective-Cの使用法:
self.view.backgroundColor = [Constants appGreenColor];
この方法で、アプリ全体の色、デフォルトのテキスト、WebサービスのURLを1か所で更新できます。
コードで他のSwift型を作成して、クラスを介してのみこれらの定数にアクセスする場合は、letステートメントをプライベートにする必要があります。
private let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)
@objc class Constant {
class func appGreenColor() -> UIColor { return AppGreenColor }
}
Swiftでは、次のように使用できます。
UIColor *greenColor = Constant.appGreenColor
Letステートメントはprivateであるため、次の行はもうコンパイルされません。
UIColor *greenColor = appGreenColor