1. filter 优化
原代码
if var vcs = vcs {
for vc in vcs {
if vc is XXLoginViewController {
if let index = vcs.firstIndex(of: vc) {
vcs.remove(at: index)
}
}
}
修改后
vcs = vcs?.filter { !($0 is XXLoginViewController) }
或者
vcs?.removeAll(where: { $0 is XXLoginViewController })
filter, map, reduce的用法详见
https://juejin.cn/post/6844903574506307592
https://www.jianshu.com/p/74854e641d87
2. return 优化
案例1
func checkExpire(time: TimeInterval) -> Bool {
if Date().timeIntervalSince1970 - time > 0 {
return false
}
return true
}
优化后
func checkExpire(time: TimeInterval) -> Bool {
return Date().timeIntervalSince1970 < time
}
是不是更简洁了呢!
案例2
if (isInCache) {
return result;
} else {
return [DataXXManager.shareManager isStickUpWithXxId:xxId];
}
可以通过移除不必要的else语句来优化代码,因为在if条件满足时,return会直接返回,后续代码不会执行。以下是优化后的代码:
优化后
if (isInCache) {
return result;
}
return [DataXXManager.shareManager isStickUpWithXxId:xxId];
3. for循环优化
案例1
for index in 0..<array.count {
guard let item = array[index] as? XXX else {
continue
}
// do other
}
优化后
for (index, header) in array.enumerated() {
guard let item = header as? XXX else {
continue
}
// do other
}
案例2
优化前
var index = 0
var tempItems: [[ObjectProtocol]] = [ObjectProtocol]
for item in self.items {
if index >= 3 {
break
}
if let f = self.items.last as? [ObjectProtocol] {
tempItems.append(f)
}
index += 1
}
self.items = tempItems
优化后
var tempItems: [[ObjectProtocol]] = []
for item in self.items.prefix(3) {
if let f = item as? [ObjectProtocol] {
tempItems.append(f)
}
}
self.items = tempItems
4. 枚举 优化
例如有如下的需求,像数据库中添加obj字段,obj的order字段如果是auto,则根据head和tail字段来表示自动变化order,如果非auto,则使用obj自己的order字段 内容。
直观的代码如下:
- (void)addSomethingToDB(NSObject *)obj auto:(BOOL)auto isAddToHead:(BOOL)head isAddToTail:(BOOL)tail {
if (auto) {
if (head) {
obj.order = --index
} else if (tail) {
obj.order = ++index
}
}
}
上面的代码,用了auto, head和tail来表示,添加的顺序。是不是繁琐。那怎么简化呢?
可以用枚举来优化。
typedef NS_ENUM(NSInteger, XXSortOrder) {
XXSortOrderNo, // 不自动排序
XXSortOrderAddToHead, // 自动排序,在头插入
XXSortOrderAddTail, // 自动排序,在尾插入
}
- (void)addSomethingToDB(NSObject *)obj sortType:(XXSortOrder)sortType {
if (XXSortOrder == XXSortOrderAddToHead) {
obj.order = --index
} else if (XXSortOrder == XXSortOrderAddToHead) {
obj.order = ++index
}
}
这么写,是不是从方法名和函数内容都精简了不少呢?哈。
5. 多个if else 优化
- 使用字典映射类型与类
你可以使用一个字典来映射类型字符串(或枚举值)到相应的类,然后动态创建对象。这样可以减少大量的if或switch语句,提升代码的可维护性和可扩展性。
// 定义一个映射字典,键是类型字符串,值是类名
NSDictionary<NSString *, Class> *typeToClassMap = @{
@"TypeA": [ClassA class],
@"TypeB": [ClassB class],
@"TypeC": [ClassC class]
};
// 通过类型字符串来获取类并创建实例
NSString *type = @"TypeA"; // 这里是动态获取的类型
Class targetClass = typeToClassMap[type];
if (targetClass) {
id instance = [[targetClass alloc] init];
// 你可以在此实例上调用方法或做其他操作
} else {
NSLog(@"Unknown type: %@", type);
}
////////////////////////////////////////////////////
// 映射枚举值到类
NSDictionary<NSNumber *, Class> *typeToClassMap = @{
@(ObjectTypeA): [ClassA class],
@(ObjectTypeB): [ClassB class],
@(ObjectTypeC): [ClassC class]
};
// 使用映射字典来获取类并创建实例
- (id)createObjectForType:(ObjectType)type {
Class targetClass = typeToClassMap[@(type)];
if (targetClass) {
return [[targetClass alloc] init];
}
return nil; // 未知类型
}
- 使用协议和类簇
如果你的对象类型之间有共同的接口,可以考虑使用协议和类簇。通过协议,所有的类型实现相同的方法,这样你就可以不需要具体了解类型的实现细节,只需要通过协议的方法来操作对象。
// 定义一个协议
@protocol ObjectTypeProtocol <NSObject>
- (void)performAction;
@end
// 具体的类实现协议
@interface ClassA : NSObject <ObjectTypeProtocol>
@end
@implementation ClassA
- (void)performAction {
NSLog(@"ClassA action");
}
@end
@interface ClassB : NSObject <ObjectTypeProtocol>
@end
@implementation ClassB
- (void)performAction {
NSLog(@"ClassB action");
}
@end
// 工厂方法
+ (id<ObjectTypeProtocol>)createObjectForType:(NSString *)type {
if ([type isEqualToString:@"TypeA"]) {
return [[ClassA alloc] init];
} else if ([type isEqualToString:@"TypeB"]) {
return [[ClassB alloc] init];
}
return nil;
}
// 使用
id<ObjectTypeProtocol> object = [Factory createObjectForType:@"TypeA"];
[object performAction];
- 使用 NSClassFromString 和反射机制
如果类名是动态的,可以通过 NSClassFromString 来实现反射机制来获取类。
NSString *className = @"ClassA"; // 动态类名
Class class = NSClassFromString(className);
if (class) {
id instance = [[class alloc] init];
// 你可以在此实例上调用方法或做其他操作
} else {
NSLog(@"Class not found: %@", className);
}