如何在Objective C中使用Swift结构

Din*_*uan 84 constants objective-c swift

我只有一个存储应用程序常量的结构如下:

struct Constant {

    static let ParseApplicationId = "xxx"
    static let ParseClientKey = "xxx"

    static var AppGreenColor: UIColor {
        return UIColor(hexString: "67B632")
    }
}
Run Code Online (Sandbox Code Playgroud)

Constant.ParseClientKey例如,通过调用可以在Swift代码中使用这些常量.但在我的代码中,它还包含一些Objective C类.所以我的问题是如何在Objective C代码中使用这些常量?

如果这种声明常量的方法不好那么创建全局常量以在Swift和Objective C代码中使用的最佳方法是什么?

rin*_*aro 101

不幸的是,你不能暴露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 }
}
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,您可以像这样使用它们:

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];
Run Code Online (Sandbox Code Playgroud)

  • 应该使用```@objc类Constant:NSObject``` (7认同)
  • 这是可行的,但在 Swift 4 中,我还需要将 `@objc` 放在每个 `class func` 前面,以便能够从 Objective C 代码中调用它们。 (2认同)
  • @ElectroBuddha 您可以在类上执行 ```@objcMembers``` 以向 Objective-C 代码显示整个类。 (2认同)

小智 17

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 }
}
Run Code Online (Sandbox Code Playgroud)

  • 我并不清楚我们是否可以滚动你的答案来发现 Objective-C 部分! (2认同)