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
Luke Rogers

1
@NikolaiRuhe Swift宣言を見てください:developer.apple.com/library/ios/documentation/UIKit/Reference/…—これは間違いなく構造体です。
Luke Rogers

1
@LukeRogers NS_OPTIONSスタイル列挙型のインポート方法がSwift 2.0で変更されたためです。意味的にUIControlEventは、まだ列挙型です。
Nikolai Ruhe

5
@NikolaiRuhe LukeRogers:Dinhはその問題について質問しなかったし、ほとんどの視聴者はここをクリックしてそれについて読んでいませんでした。
original_username

回答:


114

悲しいことに、structObjective-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

7
使用する必要があります@objc class Constant: NSObject
William Hu

1
これは機能しますが、Swift 4では、Objective Cコードからそれらを呼び出すことができるように@objc、すべての前に置く必要もありましたclass func
ElectroBuddha 2018年

2
@ElectroBuddha @objcMembersクラス全体でObjective-Cコードにクラス全体を公開できます。
user1898712

19

次のようなa 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"

Swiftの使用法:

self.view.backgroundColor = Constant.kAppGreenColor

Objective-Cの使用:

self.view.backgroundColor = [Constants appGreenColor];

このようにして、アプリ全体の色、デフォルトのテキスト、WebサービスのURLを1か所で更新できます。


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 cコードで使用するには、#import "ProjectModuleName-Swift.h"を実行する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.