【问题标题】:Swift exc_bad_access when applying a function应用函数时 Swift exc_bad_access
【发布时间】:2015-04-21 11:21:15
【问题描述】:

好吧,伙计们,我被难住了。

所以我正在按照this article 的方式开发功能性 json 实现。事情进展得相当顺利,但我有一个问题在 Xcode 和 Swift 的当前版本和 beta 版本中都存在。

我的解码逻辑从左侧的 JSON 字典中获取一个参数,并使用右侧提供的解码函数,使用“绑定”运算符组合它们:

return AdUnitDictionary.create <^>
    d["adRepeats"]          >>> _JSONInt        <*>
    d["adStartsAfter"]      >>> _JSONInt        <*>
    d["advertisingOn"]      >>> _JSONInt        <*>
    d["numberOfCards"]      >>> _JSONInt        <*>
    d["adUnitIdNonRetina"]  >>> _JSONString     <*>
    d["adUnitIdRetina"]     >>> _JSONString

绑定是这样定义的:

func >>><A, B>(a: Result<A>, f: A -> Result<B>) -> Result<B> {
    switch a {
    case let .Value(x):     return f(x.value)
    case let .Error(error): return .Error(error)
    }
}

因此,最初,此方法尝试转换字符串并在失败时返回一个安全的空字符串。我以为我从 if-let 块中获得了 EXC_BAD_ACCESS:

func _JSONString(object: JSON) -> String {
    if let object = object as? String { return object } // EXC_BAD_ACCESS
    return ""
}

因为'if-let' 行是调试器显示要抛出的异常的地方。然而!消除该块并使用完全忽略其参数的函数会导致在返回时抛出异常!

func _JSONString(object: JSON) -> String {
    return "" // EXC_BAD_ACCESS
}

我能理解的唯一意义是被应用的函数是 nil,因为在 bind 的实现中检查了参数本身是否存在。但是,这没有任何意义,因为调试器会在抛出异常之前将其直接放入我的目标函数中。

另一个谜团是为什么数字解码成功而没有任何问题,即使它们只是具有不同类型专业化的字符串解码器的复本。

有什么想法吗?

【问题讨论】:

  • 最后很有趣……我不敢相信
  • 您是否有一个示例输入数据可以可靠地重现这一点?实际问题似乎不在您提供的代码范围内。或者,我会怀疑实际的崩溃发生在其他队列上。我会将这个问题简化为一个较小的程序来演示它。
  • 您找到解决方案了吗?返回通用函数时,我的访问也很糟糕。

标签: ios json swift functional-programming


【解决方案1】:

检查你的模式!

let object: Int? = nil
if let object = object as? String {
    print("a")
} else {
    print("nil")
}
// prints nil

let object: Int = 1
if let object = object as? String {
    print("a")
} else {
    print("nil")
}
// prints nil

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多