应用函数时Swift exc_bad_access

时间:2015-02-19 22:00:03

标签: ios json swift functional-programming

好吧,伙计们,我很难过。

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

我的解码逻辑从左边的JSON字典中获取一个参数,并使用右边提供的解码函数,用'bind'操作符组成它们:

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

Bind的定义如下:

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的实现中。但是,这没有任何意义,因为调试器在抛出异常之前使其正确进入我的目标函数。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

检查你的模式!

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