如何在Objective-C中使用Swift结构


97

简单地说,我有一个存储应用程序常量的结构,如下所示:

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代码中使用的全局常量的最佳方法是什么?


22
请遵循常见的swift代码样式,并使用小写字母开头的let / var标识符。
Nikolai Ruhe 2014年

4
@NikolaiRuhe这不是结构静态属性的正确样式吗?很像UIControlEvents.TouchUpInside
路加·罗杰斯

1
@NikolaiRuhe看一下Swift声明:developer.apple.com/library/ios/documentation/UIKit/Reference / ...- 这绝对是一个结构。
路加·罗杰斯

1
@LukeRogers那是因为Swift 2.0改变了如何导入NS_OPTIONS样式枚举的方式。语义UIControlEvent上仍然是枚举类型。
Nikolai Ruhe 2015年

5
@NikolaiRuhe LukeRogers:Dinh并没有问这个问题,而且我们大多数观众没有单击此处来了解它。
original_username

Answers:


114

可悲的是,你不能暴露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];

也可以使用Swift吗?
khunshan 2014年

@khunshan是的。可直接访问ParseClientKey,也可以通过课程访问Constant.clientKey()
Fabian 2014年

7
应该使用@objc class Constant: NSObject
William Hu

1
这可以工作,但是在Swift 4中,我还需要放在@objc每个对象的前面,class func以便能够从Objective C代码中调用它们。
ElectroBuddha

2
@ElectroBuddha您可以@objcMembers在该类上进行操作,以便向Objective-C代码显示整个类。
user1898712

19

为什么不使用a struct和an 创建文件@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服务网址。


1
我现在还不清楚我们是否可以滚动您的答案来发现Objective-C的一部分!
心教堂

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

1

尽管这可能会晚点或多余,但我可以将其与以下代码一起使用:

@objcMembers class Flags: NSObject {
    static let abcEnabled = false
    static let pqrEnabled = false
    .
    .
    .
}

显然,要在objc代码中使用,必须执行#import“ ProjectModuleName-Swift.h”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.