我只有一个存储应用程序常量的结构如下:
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代码中使用的全局常量的最佳方法是什么?
答案 0 :(得分:91)
不幸的是,可以不暴露struct
,也不全局变量的Objective-C。见the documentation。
截至目前,恕我直言,最好的方式是这样的:
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];
答案 1 :(得分:13)
为什么不创建包含//if necessary, loop through all strings
var str = 'F19 vs40KETAPY Y Y';
//remove the matches
var str = str.replace(/\d\s?Y|\+\s?Y|\-\s?Y|\"\s?Y|A\s?Y|Yu|Y\]|YQ|YT|Y0|Yt/g, '');
//check for 3 Y's in the remaining string
if (str.match(/Y/g).length == 3) {
alert('match');
}
和struct
的文件,如下所示:
@objc class
要在Objective-C文件中使用,请在需要使用常量时添加:
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 }
}
快速使用:
#import "ProjectModuleName-Swift.h"
Objective-C用法:
self.view.backgroundColor = Constant.kAppGreenColor
这样您就可以在一个地方更新整个应用的颜色,默认文本,网络服务网址。
答案 2 :(得分: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语句是私有的:
UIColor *greenColor = appGreenColor
答案 3 :(得分:1)
尽管这可能会晚点或多余,但我可以使它与以下代码一起使用:
@objcMembers class Flags: NSObject {
static let abcEnabled = false
static let pqrEnabled = false
.
.
.
}
很明显,要在objc C代码中使用,必须执行#import“ ProjectModuleName-Swift.h”