Cara menggunakan struktur Swift di Objective-C

97

Sederhananya saya memiliki struct yang menyimpan konstanta aplikasi seperti di bawah ini:

struct Constant {

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

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

Konstanta ini dapat digunakan dalam kode Swift dengan memanggil, Constant.ParseClientKeymisalnya. Tetapi dalam kode saya, itu juga berisi beberapa kelas Objective-C. Jadi pertanyaan saya adalah bagaimana menggunakan konstanta ini dalam kode Objective-C?

Jika cara mendeklarasikan konstanta ini tidak baik, lalu apa cara terbaik untuk membuat konstanta global untuk digunakan di kode Swift dan Objective-C?

Dinh Quan
sumber
22
Harap ikuti gaya kode swift umum dan gunakan huruf kecil untuk memulai pengenal let / var Anda.
Nikolai Ruhe
4
@NikolaiRuhe Bukankah ini gaya yang benar untuk properti statis sebuah struct? Suka UIControlEvents.TouchUpInside?
Luke Rogers
1
@NikolaiRuhe Lihat deklarasi Swift: developer.apple.com/library/ios/documentation/UIKit/Reference/… - ini jelas sebuah struct.
Luke Rogers
1
@LukeRogers Itu karena cara Swift 2.0 yang diubah tentang cara mengimpor NS_OPTIONSenum gaya. Secara semantik UIControlEventmasih merupakan jenis pencacahan.
Nikolai Ruhe
5
@NikolaiRuhe LukeRogers: Dinh tidak bertanya tentang masalah itu, dan sebagian besar dari kami penonton tidak mengklik di sini untuk membacanya.
original_username

Jawaban:

114

Sayangnya, Anda tidak dapat mengekspos struct, atau variabel global ke Objective-C. lihat dokumentasinya .

Untuk saat ini, IMHO, cara terbaik adalah seperti ini:

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

Di Objective-C, Anda dapat menggunakannya seperti ini:

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];
rintaro
sumber
Dapat diakses oleh Swift juga?
khunshan
Ya Dapat diakses secara langsung ParseClientKey, atau melalui kelasConstant.clientKey()
Fabian
7
Harus menggunakan@objc class Constant: NSObject
William Hu
1
Ini berfungsi tetapi di Swift 4, saya juga harus meletakkan @objcdi depan setiap class funcuntuk dapat memanggil mereka dari kode Objective C.
ElectroBuddha
2
@ElectroBuddha Anda dapat melakukannya @objcMembersdi kelas untuk menampilkan seluruh kelas ke kode Objective-C.
user1898712
19

Mengapa tidak membuat file dengan a structdan an @objc class, sesuatu seperti ini:

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

Untuk digunakan dalam file Objective-C, tambahkan ini saat Anda perlu menggunakan konstanta:

#import "ProjectModuleName-Swift.h"

Penggunaan cepat:

self.view.backgroundColor = Constant.kAppGreenColor

Penggunaan Objective-C:

self.view.backgroundColor = [Constants appGreenColor];

Dengan cara ini Anda dapat memperbarui warna, teks default, url layanan web untuk seluruh aplikasi di satu tempat.

Marijan V.
sumber
1
Tidak segera jelas bagi saya bahwa kami dapat menggulir jawaban Anda untuk menemukan bagian objektif-c!
Cœur
1

Anda harus membuat pernyataan let menjadi pribadi jika Anda ingin membuat tipe Swift lain dalam kode Anda untuk mengakses konstanta ini hanya melalui kelas:

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

Di Swift, Anda dapat menggunakannya seperti ini:

UIColor *greenColor = Constant.appGreenColor

Baris berikut tidak akan dikompilasi lagi sekarang karena pernyataan let bersifat pribadi:

UIColor *greenColor = appGreenColor
koira
sumber
1

Meskipun ini mungkin terlambat atau berlebihan, saya dapat membuatnya bekerja dengan kode berikut:

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

Tentunya, untuk menggunakan kode objc c, Anda harus melakukan #import "ProjectModuleName-Swift.h"

Anil Arigela
sumber