簡體   English   中英

應用函數時的Swift exc_bad_access

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM