Как использовать Swift struct в Objective C
просто у меня есть структура, которая хранит константы приложения, как показано ниже:
struct Constant {
static let ParseApplicationId = "xxx"
static let ParseClientKey = "xxx"
static var AppGreenColor: UIColor {
return UIColor(hexString: "67B632")
}
}
эти константы можно использовать в Swift-коде, вызвав Constant.ParseClientKey например. Но в моем коде он также содержит некоторые классы Objective C. Итак, мой вопрос заключается в том, как использовать эти константы в коде Objective C?
Если этот способ объявления констант не является хорошим, то каков наилучший способ создания глобальных констант для использования в коде Swift и Objective C ?
3 ответов:
к сожалению, вы не можете подвергнуть
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];
//Why not create a file something like this: import UIKit import Foundation 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 } } //for use in Objective-C files add this when you need to use constants: //#import "ProjectModuleName-Swift.h" //Swift usage: //self.view.backgroundColor = Constant.kAppGreenColor //Objective-C file: //self.view.backgroundColor = [Constants appGreenColor]; //This way you can update colors, default text, web service urls for whole app in one place. //just an idea on this thread.
вы должны сделать операторы let закрытыми, Если вы хотите сделать другие типы Swift в своем коде для доступа к этим константам только через class:
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 является частным:
UIColor *greenColor = appGreenColor
Comments