首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIFT1.2演员[AnyObject?]致[AnyObject]

SWIFT1.2演员[AnyObject?]致[AnyObject]
EN

Stack Overflow用户
提问于 2015-07-29 20:47:30
回答 4查看 131关注 0票数 1

如果您查看此函数:

代码语言:javascript
复制
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

在启用优化的版本配置中,在编译过程中会出现以下错误:

代码语言:javascript
复制
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!
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-29 21:24:12

如果您使用以下内容,如果您使用identifier不是字典中的键,那么您的应用程序就会崩溃:

代码语言:javascript
复制
let identifiers = json.map { $0[ identifier ]! }

因此,您可能要做的是先过滤它,然后执行映射,知道可以强制展开,因为您已经检查了该键:

代码语言:javascript
复制
let identifiers = json.filter({ $0[ identifier ] != nil }).map { $0[ identifier ]! }

但是如果是我的话,我会为了完全的安全而彻底解除压力,即使一周后其他人甚至是你自己回到这个代码中,然后拿出过滤器,猴子们也会这么做:

代码语言:javascript
复制
let identifiers = json.map({ $0[ identifier ] ?? NSNull() }).filter { !($0 is NSNull) }

现在,您可以安全地使用nil合并操作符(??)展开包装,并提供默认对象(NSNull),然后过滤掉这些默认对象。

票数 1
EN

Stack Overflow用户

发布于 2015-07-29 21:38:57

一种方法是使用flatMap:

代码语言:javascript
复制
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测试)

票数 3
EN

Stack Overflow用户

发布于 2015-07-29 21:20:10

您可能想要使用这样的东西来代替:

代码语言:javascript
复制
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更加简洁:

代码语言:javascript
复制
return json.flatMap { $0[key] }

它只返回非零的结果,并消除了任何铸造的需要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31710785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档