Reputation: 5079
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
#define
directive 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.35
can 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
Upvotes: 78
Views: 109409
Reputation: 221
Just 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 }
}
Upvotes: 22
Reputation: 2727
The 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 = "www.google.com"
class test {
}
Upvotes: -1
Reputation: 3831
simple swift language don't need an macros all #define directives. will be let and complex macros should convert to be func
Upvotes: 1
Reputation: 5558
At the moment, some #define
s 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 #define
s to actual constants, which is better than #define
s 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.
Upvotes: 66
Reputation: 11361
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)
}
Upvotes: 8