Contents

在工程中经常需要管理 URL Color 等常量,通常采取的是用宏来管理。

比如新建一个 SCUrl.h:

// user kit url
#define HOST_PREFIX       @"http://www.example.com"
#define URL_USER_LOGIN    HOST_PREFIX"/login"

后面在用到之时再导入相关的头文件,再引用 URL_USER_LOGIN.

Color 也类似,新建一个 SCColor.h 再定义一系列的宏

#define SCBlue            [UIColor colorWithRed:78.0/255.0 green:143.0/255.0 blue:171.0/255.0 alpha:1.0]
#define SCBlueLight        [UIColor colorWithRed:120.0/255.0 green:181.0/255.0 blue:209.0/255.0 alpha:1.0]

用宏来同一管理带来的坏处就是——不直观,宏满天飞。整个头文件体积庞大了之后阅读起来是个灾难。

##Category 的特性
Category 是 Objective-C 的语言特性,可以不改变已有代码而增加新功能,同样的也可以无视源代码是如何实现的。比如 UIColor 的实现是没有暴露给开发者的,但是不妨碍我们对 UIColor 增加我们想要的新功能。
一个有趣的应用场景

例如你可能下載了某款功能超強的2D物理引擎程式碼,但因為某些小地方寫的不合你的需求,於是你便動手改原始碼來加功能。這當然沒問題,但萬一原作出新的版本,你要不就選擇維持自己原來的版本不update,不然就是update之後,你原來加在舊版本的程式碼得再重貼一次到新版。quote from 高見龍

##用 Category 管理 Color 和 URL

基于以上谈到的宏的缺点:可读性差。我自己摸索出用 Category 的特性来管理 Color 的方法并推广到 URL 上(或许很多人都是这么干的,我并没有查证过)。

  • 新建一个 UIColor 的 category

h

//
//  UIColor+SMColor.h
//  StudentMe-iOS
//
//  Created by SeanChense on 15/7/25.
//  Copyright (c) 2015年 UESTC-BBS. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIColor (SMColor)

//for example
+ (UIColor *)smBlue;
+ (UIColor *)smBlueLight;


@end

m

//
//  UIColor+SMColor.m
//  StudentMe-iOS
//
//  Created by SeanChense on 15/7/25.
//  Copyright (c) 2015年 UESTC-BBS. All rights reserved.
//

#import "UIColor+SMColor.h"

@implementation UIColor (SMColor)

+ (UIColor *)smBlue {
    return [UIColor colorWithRed:78.0/255.0 green:143.0/255.0 blue:171.0/255.0 alpha:1.0];
}

+ (UIColor *)smBlueLight {
    return [UIColor colorWithRed:120.0/255.0 green:181.0/255.0 blue:209.0/255.0 alpha:1.0];
}
@end
  • 在工程中使用时引入 UIColor+SMColor.h 调用 [UIColor smBlue] 便是。同时 [UIColor whiteColor] 可以调用 UIColor 本身的方法。代码上有着强烈的一致性。

同理可以对 NSURL 新建一个 Category

h

//
//  NSURL+SMURL.h
//  StudentMe-iOS
//
//  Created by SeanChense on 15/7/25.
//  Copyright (c) 2015年 UESTC-BBS. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSURL (SMURL)

+ (NSString *)smHostString;

#pragma mark - user
+ (NSString *)smLoginString;


@end

m

//
//  NSURL+SMURL.m
//  StudentMe-iOS
//
//  Created by SeanChense on 15/7/25.
//  Copyright (c) 2015年 UESTC-BBS. All rights reserved.
//

#import "NSURL+SMURL.h"

@implementation NSURL (SMURL)

+ (NSString *)smHostString {
    return @"http://bbs.uestc.edu.cn";
}

#pragma mark - user
+ (NSString *)smLoginString {
    return [[self prefixbbsUrlString] stringByAppendingString:@"user/login"];
}



#pragma mark - private method

+ (NSString *)prefixbbsUrlString {
    return [[self smHostString] stringByAppendingString:[self bbsMiddleUrlString]];
}

+ (NSString *)bbsMiddleUrlString {
    return @"/mobcent/app/web/index.php?r=";
}
@end
Contents