2014-10-03 53 views
60

只要我有一個存儲如下應用常量的結構體:通過調用Constant.ParseClientKey例如如何使用斯威夫特結構的目標C

struct Constant { 

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

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

這些常量可以在SWIFT代碼中使用。但在我的代碼中,它也包含一些Objective C類。所以我的問題是如何在Objective C代碼中使用這些常量?

如果這種聲明常量的方法不好,那麼創建在Swift和Objective C代碼中使用全局常量的最佳方法是什麼?

+9

請遵循共同的SWIFT代碼風格和使用小寫字母開始你的/ var標識符。 – 2014-10-03 14:37:51

+2

@NikolaiRuhe這不是一個結構的靜態屬性的正確樣式嗎?很像'UIControlEvents.TouchUpInside'? – 2015-08-24 11:38:15

+0

@LukeRogers'.TouchUpInside'是枚舉成員,不是結構的屬性。 – 2015-08-24 15:42:47

回答

75

很遺憾,你不能暴露struct,也不能將全局變量暴露給Objective-C。見the documentation

截至目前,恕我直言,最好的辦法是這樣的:

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

Swift可訪問嗎? – khunshan 2014-11-25 08:03:53

+0

@ khunshan是的。直接訪問'ParseClientKey',或通過類'Constant.clientKey()' – Fabian 2014-12-04 21:20:16

+7

應該使用'''@objc類常量:NSObject''' – 2015-11-05 08:27:08

7
//Why not create a file something like this: 

import UIKit 
import Foundation 

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 file: 
//self.view.backgroundColor = [Constants appGreenColor]; 

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

//just an idea on this thread. 
0

你應該讓如果您想讓代碼中的其他Swift類型僅通過類訪問這些常量,則讓語句私有:

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

在斯威夫特,你可以使用它們像這樣:

UIColor *greenColor = Constant.appGreenColor 

下面的行不會編譯了,因爲現在的let語句是私有的:

UIColor *greenColor = appGreenColor