I am migrating a UIViewController class to train a bit with Swift. I am successfully using Objective-C code via the bridging header but I have the need of importing a constants file that contains #define directives.
I have seen in Using Swift with Cocoa and Objective-C (Simple macros) the following:
Simple Macros
Where you typically used the
#definedirective to define a primitive constant in C and Objective-C, in Swift you use a global constant instead. For example, the constant definition#define FADE_ANIMATION_DURATION 0.35can be better expressed in Swift withlet FADE_ANIMATION_DURATION = 0.35. Because simple constant-like macros map directly to Swift global variables, the compiler automatically imports simple macros defined in C and Objective-C source files.
So, it seems it's possible. I have imported the file containing my constants into the bridging header, but I have no visibility from my .swift file, cannot be resolved.
What should I do to make my constants visible to Swift?
UPDATE:
It seems working with NSString constants, but not with booleans:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift #define kBOOL_CONSTANT YES // unresolved from swift 15 Answers
At the moment, some #defines are converted and some aren't. More specifically:
#define A 1 ...becomes:
var A: CInt { get } Or:
#define B @"b" ...becomes:
var B: String { get } Unfortunately, YES and NO aren't recognized and converted on the fly by the Swift compiler.
I suggest you convert your #defines to actual constants, which is better than #defines anyway.
.h:
extern NSString* const kSTRING_CONSTANT; extern const BOOL kBOOL_CONSTANT; .m
NSString* const kSTRING_CONSTANT = @"a_string_constant"; const BOOL kBOOL_CONSTANT = YES; And then Swift will see:
var kSTRING_CONSTANT: NSString! var kBOOL_CONSTANT: ObjCBool Another option would be to change your BOOL defines to
#define kBOOL_CONSTANT 1 Faster. But not as good as actual constants.
5Just a quick clarification on a few things from above.
Swift Constant are expressed using the keywordlet
For Example:
let kStringConstant:String = "a_string_constant" Also, only in a protocol definition can you use { get }, example:
protocol MyExampleProtocol { var B:String { get } } In swift you can declare an enum, variable or function outside of any class or function and it will be available in all your classes (globally)(without the need to import a specific file).
import Foundation import MapKit let kStringConstant:String = "monitoredRegions" class UserLocationData : NSObject { class func getAllMonitoredRegions()->[String]{ defaults.dictionaryForKey(kStringConstant) } 2simple swift language don't need an macros all #define directives. will be let and complex macros should convert to be func
1The alternative for macro can be global variable . We can declare global variable outside the class and access those without using class. Please find example below
import Foundation let BASE_URL = "" class test { }