development

Objective-C에서 Swift 구조체를 사용하는 방법

big-blog 2020. 9. 25. 08:04
반응형

Objective-C에서 Swift 구조체를 사용하는 방법


간단히 아래와 같이 응용 프로그램 상수를 저장하는 구조체가 있습니다.

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 코드에서 사용할 전역 상수를 만드는 가장 좋은 방법은 무엇입니까?


안타깝게도 structObjective-C에, 전역 변수를 노출 할 수 없습니다 . 설명서를 참조하십시오 .

현재 IMHO, 가장 좋은 방법은 다음과 같습니다.

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];

왜 모두의 파일 만들 수 없습니다 struct@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 }
}

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 usage:

self.view.backgroundColor = [Constants appGreenColor];

This way you can update colors, default text, web service urls for whole app in one place.


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:

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:

UIColor *greenColor = Constant.appGreenColor

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

UIColor *greenColor = appGreenColor

참고URL : https://stackoverflow.com/questions/26173234/how-to-use-swift-struct-in-objective-c

반응형