如果您查看此函数:
typealias JSONDictionary = [String: AnyObject]
private func allIdentifiersInJson(json: [JSONDictionary], key: String?) -> [AnyObject] {
if let identifier = key {
let identifiers = json.map{ $0[identifier] } //this returns [AnyObject?]
return identifiers as? [AnyObject] ?? [] // this crashes the compiler in Release with Optimizations
}
return []
}你将如何投出一个AnyObject?到一个AnyObject
在启用优化的版本配置中,在编译过程中会出现以下错误:
Bitcast requires both operands to be pointer or neither
%548 = bitcast i64 %547 to %objc_object*, !dbg !10033
LLVM ERROR: Broken function found, compilation aborted!发布于 2015-07-29 21:24:12
如果您使用以下内容,如果您使用identifier不是字典中的键,那么您的应用程序就会崩溃:
let identifiers = json.map { $0[ identifier ]! }因此,您可能要做的是先过滤它,然后执行映射,知道可以强制展开,因为您已经检查了该键:
let identifiers = json.filter({ $0[ identifier ] != nil }).map { $0[ identifier ]! }但是如果是我的话,我会为了完全的安全而彻底解除压力,即使一周后其他人甚至是你自己回到这个代码中,然后拿出过滤器,猴子们也会这么做:
let identifiers = json.map({ $0[ identifier ] ?? NSNull() }).filter { !($0 is NSNull) }现在,您可以安全地使用nil合并操作符(??)展开包装,并提供默认对象(NSNull),然后过滤掉这些默认对象。
发布于 2015-07-29 21:38:57
一种方法是使用flatMap:
let l: [AnyObject?] = [1, 2, 3, 4, 5, 6, nil, 7]
let m = l.flatMap { $0 } // Returns [1, 2, 3, 4, 5, 6, 7] as [AnyObject](只在Swift 2测试)
发布于 2015-07-29 21:20:10
您可能想要使用这样的东西来代替:
private func allIdentifiersInJson(json: [JSONDictionary], key: String?) -> [AnyObject] {
if let key = key {
return json.map { $0[key] }.filter { $0 != nil } as! [AnyObject]
}
return []
}因为我们使用filter来删除nil的所有实例,所以我们可以使用强制转换到[AnyObject],而不必担心崩溃。
或者,正如@MirekE在他们的回答中所指出的,flatMap更加简洁:
return json.flatMap { $0[key] }它只返回非零的结果,并消除了任何铸造的需要。
https://stackoverflow.com/questions/31710785
复制相似问题