Category 在工程中的应用--URL、Color 管理
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