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
일반적인 빠른 코드 스타일을 따르고 let / var 식별자를 시작하려면 소문자를 사용하십시오.
Nikolai Ruhe 2014 년

4
@NikolaiRuhe 이것이 구조체의 정적 속성에 대한 올바른 스타일이 아닐까요? 아주 좋아 UIControlEvents.TouchUpInside?
Luke Rogers

1
@NikolaiRuhe Swift 선언을 살펴보세요 : developer.apple.com/library/ios/documentation/UIKit/Reference/…- 확실히 구조체입니다.
Luke Rogers

1
@LukeRogers Swift 2.0의 NS_OPTIONS스타일 열거 형 가져 오기 방법이 변경 되었기 때문입니다 . 의미 상 UIControlEvent여전히 열거 형입니다.
Nikolai Ruhe 2015 년

5
@NikolaiRuhe LukeRogers : Dinh은 그 문제에 대해 묻지 않았고 우리 대부분의 시청자는 여기를 클릭하여 읽지 않았습니다.
original_username

답변:


114

안타깝게도 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];

Swift에도 액세스 할 수 있습니까?
khunshan 2014

@khunshan 예. 직접 ParseClientKey또는 수업을 통해 이용 가능Constant.clientKey()
Fabian 2014

7
사용해야@objc class Constant: NSObject
윌리엄 후에게

1
이것은 작동하지만 Swift 4에서는 Objective C 코드에서 호출 할 수 있도록 @objc모든 항목 앞에 배치해야했습니다 class func.
ElectroBuddha

2
@ElectroBuddha @objcMembers전체 클래스를 Objective-C 코드에 공개하기 위해 클래스에서 할 수 있습니다 .
user1898712

19

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

Objective-C 파일에서 사용하려면 상수를 사용해야 할 때 다음을 추가하십시오.

#import "ProjectModuleName-Swift.h"

신속한 사용법 :

self.view.backgroundColor = Constant.kAppGreenColor

Objective-C 사용 :

self.view.backgroundColor = [Constants appGreenColor];

이렇게하면 전체 앱의 색상, 기본 텍스트, 웹 서비스 URL을 한 곳에서 업데이트 할 수 있습니다.


1
목표 -c 부분을 발견하기 위해 당신의 대답을 스크롤 할 수 있다는 것이 나에게 즉시 명확하지 않았습니다!
Cœur

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 문이 private이기 때문에 더 이상 컴파일되지 않습니다.

UIColor *greenColor = appGreenColor

1

이것이 늦거나 중복 될 수 있지만 다음 코드로 작동하도록 만들 수 있습니다.

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

분명히 objc c 코드에서 사용하려면 #import "ProjectModuleName-Swift.h"를 수행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.