[英]Swift exc_bad_access when applying a function
好的,我很困惑。
所以,我正在沿着線功能JSON實現這篇文章 。 事情進展順利,但是我有一個問題,該問題在Xcode和Swift的當前版本和beta版本中均存在。
我的解碼邏輯從左側的JSON字典中獲取一個參數,並使用右側提供的解碼功能,並將其與'bind'運算符組成:
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的實現中。 但是,這沒有任何意義,因為調試器會在拋出異常之前將其正確地放入目標函數中。
另一個謎是為什么數字解碼成功而沒有任何問題,即使它們只是具有不同類型專長的字符串解碼器的復本。
有任何想法嗎?
檢查你的模式!
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.