在 Objective-C 中,虽然没有像 Swift 那样直接提供高阶函数(如 map、filter、reduce 等)的语法糖,但你可以通过结合 NSArray、NSDictionary 和 NSSet 的方法以及 Block(闭包)来实现类似的功能。
以下是一些常见的 Swift 高阶函数及其在 Objective-C 中的等价写法:
- map
Swift 中的 map 用于将数组中的每个元素映射为另一个值。
Swift 示例:
Swift
深色版本
let numbers = [1, 2, 3, 4]
let doubled = numbers.map { $0 * 2 }
print(doubled) // 输出 [2, 4, 6, 8]
Objective-C 等价写法:
使用 -[NSArray valueForKeyPath:] 或 enumerateObjectsUsingBlock:。
Objc
深色版本
NSArray *numbers = @[@1, @2, @3, @4];
NSMutableArray *doubled = [NSMutableArray array];
[numbers enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
[doubled addObject:@(num.integerValue * 2)];
}];
NSLog(@"%@", doubled); // 输出 (2, 4, 6, 8)
- filter
Swift 中的 filter 用于筛选数组中满足条件的元素。
Swift 示例:
Swift
深色版本
let numbers = [1, 2, 3, 4]
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // 输出 [2, 4]
Objective-C 等价写法:
使用 -[NSArray filteredArrayUsingPredicate:] 或 enumerateObjectsUsingBlock:。
Objc
深色版本
NSArray *numbers = @[@1, @2, @3, @4];
NSMutableArray *evens = [NSMutableArray array];
[numbers enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
if (num.integerValue % 2 == 0) {
[evens addObject:num];
}
}];
NSLog(@"%@", evens); // 输出 (2, 4)
或者使用 NSPredicate:
Objc
深色版本
NSArray *numbers = @[@1, @2, @3, @4];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self %% 2 == 0"];
NSArray *evens = [numbers filteredArrayUsingPredicate:predicate];
NSLog(@"%@", evens); // 输出 (2, 4)
- reduce
Swift 中的 reduce 用于将数组中的元素组合成一个单一的值。
Swift 示例:
Swift
深色版本
let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0) { 1 }
print(sum) // 输出 10
Objective-C 等价写法:
使用 enumerateObjectsUsingBlock: 手动实现。
Objc
深色版本
NSArray *numbers = @[@1, @2, @3, @4];
__block NSInteger sum = 0;
[numbers enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) {
sum += num.integerValue;
}];
NSLog(@"%ld", (long)sum); // 输出 10
- flatMap
Swift 中的 flatMap 用于映射并展开嵌套数组。
Swift 示例:
Swift
深色版本
let nested = [[1, 2], [3, 4]]
let flattened = nested.flatMap { $0 }
print(flattened) // 输出 [1, 2, 3, 4]
Objective-C 等价写法:
手动遍历嵌套数组。
Objc
深色版本
NSArray *nested = @[@[@1, @2], @[@3, @4]];
NSMutableArray *flattened = [NSMutableArray array];
[nested enumerateObjectsUsingBlock:^(NSArray *subArray, NSUInteger idx, BOOL *stop) {
[flattened addObjectsFromArray:subArray];
}];
NSLog(@"%@", flattened); // 输出 (1, 2, 3, 4)
- sorted
Swift 中的 sorted 用于对数组进行排序。
Swift 示例:
Swift
深色版本
let numbers = [3, 1, 4, 2]
let sorted = numbers.sorted()
print(sorted) // 输出 [1, 2, 3, 4]
Objective-C 等价写法:
使用 -[NSArray sortedArrayUsingComparator:]。
Objc
深色版本
NSArray *numbers = @[@3, @1, @4, @2];
NSArray *sorted = [numbers sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) {
return [a compare:b];
}];
NSLog(@"%@", sorted); // 输出 (1, 2, 3, 4)
总结
虽然 Objective-C 没有 Swift 那样的高阶函数语法糖,但通过 NSArray、NSDictionary 和 NSSet 提供的枚举方法(如 enumerateObjectsUsingBlock:)以及 NSPredicate,可以实现类似的功能。如果你需要频繁使用这些操作,可以考虑封装一些工具方法或扩展类来简化代码。