Swift + macro parameters

后端 未结 3 1093
时光取名叫无心
时光取名叫无心 2021-01-06 19:42

I read all Q&A related to Macros in Swift, And i did figure out that everything in Swift now global, Am i right?

3条回答
  •  执念已碎
    2021-01-06 20:25

    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.

提交回复
热议问题