web-dev-qa-db-fra.com

Comment utiliser Swift struct en Objective-C

J'ai simplement une structure qui stocke les constantes d'application comme ci-dessous:

struct Constant {

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

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

Ces constantes peuvent être utilisées dans le code Swift en appelant Constant.ParseClientKey par exemple. Mais dans mon code, il contient également des classes Objective-C. Ma question est donc de savoir comment utiliser ces constantes dans le code Objective-C?

Si cette façon de déclarer des constantes n'est pas bonne, quelle est la meilleure façon de créer des constantes globales à utiliser dans le code Swift et le code Objective-C?)?

81
Dinh Quan

Malheureusement, vous ne pouvez pas exposer struct, ni les variables globales à Objective-C. voir la documentation .

À partir de maintenant, à mon humble avis, la meilleure façon de procéder est la suivante:

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

En Objective-C, vous pouvez les utiliser comme ceci:

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

Pourquoi ne pas créer un fichier avec à la fois un struct et un @objc class, quelque chose comme ça:

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

A utiliser dans les fichiers Objective-C, ajoutez ceci lorsque vous devez utiliser des constantes:

#import "ProjectModuleName-Swift.h"

Utilisation rapide:

self.view.backgroundColor = Constant.kAppGreenColor

Utilisation d'Objective-C:

self.view.backgroundColor = [Constants appGreenColor];

De cette façon, vous pouvez mettre à jour les couleurs, le texte par défaut et les URL de service Web pour l'ensemble de l'application en un seul endroit.

15
Marijan V.

Vous devriez rendre les instructions let privées si vous voulez créer d'autres types de Swift dans votre code pour accéder à ces constantes uniquement via la classe:

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

Dans Swift, vous pouvez les utiliser comme ceci:

UIColor *greenColor = Constant.appGreenColor

La ligne suivante ne sera plus compilée car l'instruction let est privée:

UIColor *greenColor = appGreenColor
1
koira