【发布时间】:2017-11-23 18:01:25
【问题描述】:
我转换了这个 Objective-C 函数:
- (NSArray *)grt_map:(id (^)(id))block {
NSMutableArray *newArray = [NSMutableArray array];
[self enumerateObjectsUsingBlock:^(id item, NSUInteger index, BOOL *stop) {
id obj = block(item);
if (obj) {
[newArray addObject:obj];
}
}];
return newArray;
}
...进入斯威夫特:
public func grt_map(block:((Any) -> Any)) -> NSArray {
let array = NSMutableArray()
self.enumerateObjects ({ (item:Any, index:Int, stop: UnsafeMutablePointer<ObjCBool>)->Void in
if (block(item) != nil) {
array.add(item)
}
})
return array;
}
但我得到一个错误:
从 '(NSNumber) -> NSNumber' 转换为不相关类型 '(Any) -> Any' 总是失败
我该如何解决?
【问题讨论】:
-
你应该使用 Swift 数组,而不是
NSArray和NSMutableArray。 -
另外,您的 Swift 版本与您的 Objective-C 版本的功能不同:您正在丢弃
block的响应。 -
从 ObjC 到 Swift 的字面翻译在大多数情况下都很糟糕。如前所述,使用本机
Array而不是enumerateObjects使用flatMap()也可以关闭。而且 snake_cased 方法名称无论如何都不酷;-) -
但我想知道您在哪一行收到此错误。看起来问题会在您调用
grt_map时出现,而不是在grt_map内。看起来您正在向它传递NSNumber值的闭包。坦率地说,无论如何,我都不鼓励使用Any(或AnyObject)。指定特定类型或使用泛型。但是Any/AnyObject这样的操作有点笨拙。 -
使用 Swift 数组,您可以通过内置的
map或flatMap方法免费获得该功能。
标签: objective-c swift