【发布时间】: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