I read all Q&A related to Macros in Swift
, And i did figure out that everything in Swift now global,
Am i right?
What I did is to create a class method that returns the #define.
Example:
.h file:
#define COLOR_CODE(red, green, blue, alpha) [UIColor colorWithRed: red/255.0 green: green/255.0 blue: blue/255.0 alpha: alpha]
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
.m file:
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return COLOR_CODE(red, green, blue, alpha); }
And in Swift:
Since this is a class method you can now use it almost as you would the #define. If you change your #define macro - it will be reflected in the new method you created In Swift:
let color = YourClass.colorCodeWithRed(72.0, green: 55.0, blue: 100.0, alpha: 1.0);
You will probably need to convert it into a function or generic, as per this documentation page:
"Complex macros are used in C and Objective-C but have no counterpart in Swift. Complex macros are macros that do not define constants, including parenthesized, function-like macros. You use complex macros in C and Objective-C to avoid type-checking constraints or to avoid retyping large amounts of boilerplate code. However, macros can make debugging and refactoring difficult. In Swift, you can use functions and generics to achieve the same results without any compromises. Therefore, the complex macros that are in C and Objective-C source files are not made available to your Swift code."
As 0O0O0O0 mentioned, macros in the sense of "The compiler should see COLOR_CODE(0, 0, 0, 1)
and replace it with [UIColor colorWithRed: 0/255.0 green: 0/255.0 blue: 0/255.0 alpha: 1]
" do not exist in Swift.
Macros in C can be used in ways that produce confusing error messages:
#define IS_EQUAL_TO_ME(argument) [self isEqual: argument]
BOOL func(id argument) {
return IS_EQUAL_TO_ME(argument);
}
// Error: Use of undeclared identifier 'self'
Or destroy readability:
#define OPEN_BLOCK {
#define CLOSE_WITH_EXIT_IF_FALSE } else { exit (0); }
if (x < 0)
OPEN_BLOCK
return 10;
CLOSE_WITH_EXIT_IF_FALSE
For simple cases like COLOR_CODE
a commonly recommended strategy for C was to use inline functions:
NS_INLINE UIColor *ColorCode(CGFloat r, CGFloat g, CGFloat b, CGFloat a) {
return [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a];
}
This had the same performance as the macro in that it would get inlined to the same code but is strongly typed and does not depend on macro processing rules. This code also has a direct translation to Swift:
func ColorCode(red:CGFloat, green:CGFloat, blue:CGFloat, alpha:CGFloat) -> UIColor {
return UIColor(red: red/255, green: green/255, blue: blue/255, alpha: alpha)
}
Because "everything is global" you can declare this in any file and use it in any other file in the same module. It is up to the compiler in this case to decide whether or not to inline the function.