什么是JS的map()
功能的Objective-C等价物?我会使用NSFastEnumeration并自己应用该功能吗?
说我有 NSArray *x = @[@1, @2, @3, @4];
现在说我想要一个类似的数组 @[@2, @4, @6, @8]
在好的斯威夫特,我可以这样做:
xDoubled = x.map({($0) * 2})
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何在Objective-C中做到这一点而不做 -
NSMutableArray *xDoubled = [NSMutableArray new];
for (NSInteger xVal in x) {
[xDoubled addObject:xVal * 2];
}
Run Code Online (Sandbox Code Playgroud)
?
使用这里的答案,这个方法在obj-c中实现类似于ruby的映射:
- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block {
NSMutableArray *result = [NSMutableArray arrayWithCapacity:[self count]];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[result addObject:block(obj, idx)];
}];
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果在应用块时发生错误,我怎么能跳过一个对象?通常要跳过枚举器中的某些内容,只需使用该return
命令,但这不是上述方法中的一个选项,因为该块应该返回一些内容.
在这个例子中我用return
跳过但得到一个错误:
NSArray *mappedArray = [objArray mapObjectsUsingBlock:^(id obj, NSUInteger i) {
// i don't want this obj to be included in final array
// so I try to skip it
return; // ERROR:incompatible block pointer types sending
// 'void(^)(__strong id, …
Run Code Online (Sandbox Code Playgroud) 是否可以根据密钥属性名称从CALayer的NSArray中使用KVC获取NSDictionary?我尝试使用-dictionaryWithValuesForKeys :,但是返回一个NSArray。任何的想法?
NSArray *tempArray = [self.layer.sublayers copy];
NSArray *ListName = [self.layer.sublayers valueForKey:@"name"];
NSDictionary *tmpD= [tempArray dictionaryWithValuesForKeys:ListName];
Run Code Online (Sandbox Code Playgroud)
谢谢