How to use a Objective-C #define from Swift

Objective CMacrosSwift

Objective C Problem Overview


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 with let 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

Objective C Solutions


Solution 1 - Objective C

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.

Solution 2 - Objective C

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

Solution 3 - Objective C

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

Solution 4 - Objective C

simple swift language don't need an macros all #define directives. will be let and complex macros should convert to be func

Solution 5 - Objective C

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 {

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionatxeView Question on Stackoverflow
Solution 1 - Objective Cfabrice truillot de chambrierView Answer on Stackoverflow
Solution 2 - Objective CJoshuaView Answer on Stackoverflow
Solution 3 - Objective CAnkish JainView Answer on Stackoverflow
Solution 4 - Objective CAmr AngryView Answer on Stackoverflow
Solution 5 - Objective CgargView Answer on Stackoverflow