如何在Objective C中使用Swift struct

时间:2023-01-15 18:38:50

Simply I have a struct that stores the application constants as below:

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

struct Constant {

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

    static var AppGreenColor: UIColor {
        return UIColor(hexString: "67B632")
    }
}

These constants can be use in Swift code by calling Constant.ParseClientKey for example. But in my code, it also contains some Objective C classes. So my question is how to use these constants in the Objective C code?

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

If this way to declare constants is not good then what is the best way to create global constants to be used in both Swift and Objective C code ?

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

3 个解决方案

#1


78  

Sad to say, you can not expose struct, nor global variables to Objective-C. see the documentation.

遗憾的是,不能将struct或全局变量暴露给Objective-C。见文档。

As of now, IMHO, the best way is something like this:

到目前为止,最好的办法是:

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 }
}

In Objective-C, you can use them like this:

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

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];

#2


7  

//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.

#3


0  

You should make the let statements private if you want to make other Swift types in your code to access these constants only via class:

如果您想让代码中的其他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 }
}

In Swift, you can use them like this:

在Swift中,您可以这样使用它们:

UIColor *greenColor = Constant.appGreenColor

The following line will not compile anymore now since the let statement is private:

由于let语句是私有的,下面一行现在不会再编译了:

UIColor *greenColor = appGreenColor

#1


78  

Sad to say, you can not expose struct, nor global variables to Objective-C. see the documentation.

遗憾的是,不能将struct或全局变量暴露给Objective-C。见文档。

As of now, IMHO, the best way is something like this:

到目前为止,最好的办法是:

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 }
}

In Objective-C, you can use them like this:

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

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];

#2


7  

//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.

#3


0  

You should make the let statements private if you want to make other Swift types in your code to access these constants only via class:

如果您想让代码中的其他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 }
}

In Swift, you can use them like this:

在Swift中,您可以这样使用它们:

UIColor *greenColor = Constant.appGreenColor

The following line will not compile anymore now since the let statement is private:

由于let语句是私有的,下面一行现在不会再编译了:

UIColor *greenColor = appGreenColor