iOS -- 代码优化

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 优化

  1. 使用字典映射类型与类
    你可以使用一个字典来映射类型字符串(或枚举值)到相应的类,然后动态创建对象。这样可以减少大量的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; // 未知类型
}
  1. 使用协议和类簇
    如果你的对象类型之间有共同的接口,可以考虑使用协议和类簇。通过协议,所有的类型实现相同的方法,这样你就可以不需要具体了解类型的实现细节,只需要通过协议的方法来操作对象。
// 定义一个协议
@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];
  1. 使用 NSClassFromString 和反射机制
    如果类名是动态的,可以通过 NSClassFromString 来实现反射机制来获取类。
NSString *className = @"ClassA";  // 动态类名
Class class = NSClassFromString(className);
if (class) {
    id instance = [[class alloc] init];
    // 你可以在此实例上调用方法或做其他操作
} else {
    NSLog(@"Class not found: %@", className);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值