简单地说,我有一个存储应用程序常量的结构如下:
struct Constant {
static let ParseApplicationId = "xxx"
static let ParseClientKey = "xxx"
static var AppGreenColor: UIColor {
return UIColor(hexString: "67B632")
}
}
这些常量可以通过调用Constant在Swift代码中使用。例如,ParseClientKey
。但是在我的代码中,它也包含一些Object-C类。所以我的问题是如何在Object-C代码中使用这些常量?
如果这种声明常量的方法不好,那么创建全局常量以用于Swift和Object-C代码的最佳方法是什么?
虽然这可能很晚或多余,但我可以使用以下代码使其工作:
@objcMembers class Flags: NSObject {
static let abcEnabled = false
static let pqrEnabled = false
.
.
.
}
显然,要在objc c代码中使用,必须导入“ProjectModuleName Swift.h”
为什么不创建一个既有结构
又有@objc类
的文件,如下所示:
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
Object-C用法:
self.view.backgroundColor = [Constants appGreenColor];
通过这种方式,您可以在一个地方更新整个应用程序的颜色、默认文本和web服务URL。
遗憾的是,您不能向Objective-C公开struct
,也不能公开全局变量。请参阅文档,其中部分说明:
需要Objective-C互操作性时使用类
如果使用需要处理数据的Objective-C API,或者需要将数据模型放入Objective-C框架中定义的现有类层次结构中,则可能需要使用类和类继承对数据建模。例如,许多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 }
}
在Object-C中,可以这样使用它们:
NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];
问题内容: 我正在迁移课程,以便对Swift进行一些培训。我通过桥接头成功使用了Objective- C代码,但是我需要导入一个包含指令的常量文件。 我在结合Swift和Cocoa和Objective-C(简单宏)中看到以下内容: 简单宏 通常在C和Objective-C中使用指令定义原始常量的地方,在Swift中使用全局常量代替。例如,常数定义可以在Swift中使用更好地表达。由于简单的类似于常
问题内容: 有什么方法可以在我的Swift项目中使用swift使用用Objective-C编写的CocoaPod吗? 我只是制作桥接头吗?如果可以,我可以在Swift中访问CocoaPod中的库定义的对象,类和字段吗? 问题答案: 您问题的基本答案是,可以,您可以使用CocoaPods构建的Objective-C代码。 更重要的问题是“如何使用此类库?” 这个问题的答案取决于您中的标志: 假设您要
我正在尝试实现音频可视化器到AVAudioPlayer从许多天,尝试了不同的库,但没有成功。现在我发现了一个库displayer,但问题是它在Objective-C中,现在我不知道如何在swift代码中使用它。这里是图书馆https://github.com/agilie/displayers-audio-visualizers的链接。请在这方面指导我,或者在SWIFT中建议我一个好的可视化器。
问题内容: 我有一个带有值的枚举,它将用于告诉将消息记录到服务器的服务器类型的API方法。我正在使用Swift 1.2,因此可以将枚举映射到Objective-C 我得到错误 @objc枚举原始类型字符串不是整数类型 我没有设法找到任何地方说只有整数可以从Swift转换为Objective-C。是这样吗 如果是这样,是否有人对在Objective- C中提供类似的最佳实践建议? 问题答案: 从Xc
问题内容: 我正在将我的项目从Objective-c转换为Swift,并且正在使用一个Swift类,我正在尝试在Objective- c类中进行访问。我的问题是,在Objective-C类中不可访问。这是我的速成班: 当我查看文件时,看不到: 当我尝试在我的Objective-c类中使用时,出现编译器错误。 有人知道这个问题吗?如何在Objective-c中访问Swift协议? 问题答案: 您需要
假设我在Swift中定义了一个泛型类,类似于以下内容: (我知道数组有一个稍微好一点的实现,这只是一个例子。) 在Swift中,我现在可以非常容易地使用这个类: 在Xcode 7中,我们现在在Objective-C中拥有泛型,所以我假设我可以在Objective-C中使用这个类: 然而,MyArray从未添加到我的<code>项目Swift中。h文件。即使我将其更改为从NSObject继承,它仍然