所以我正在按照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的实现中。但是,这没有任何意义,因为调试器在抛出异常之前使其正确进入我的目标函数。
另一个谜团是为什么数字解码成功没有任何问题,即使它们只是具有不同类型专业化的字符串解码器的碳复制品。
有什么想法吗?
答案 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