gpt4 book ai didi

ios - 使用 Swift 语法在 block 中处理错误

转载 作者:行者123 更新时间:2023-11-28 07:00:48 25 4
gpt4 key购买 nike

这里的错误处理感觉不对。有人对如何改进它有任何建议吗?使用可选绑定(bind)来建立错误和返回值变量。

这么酷?

class ChargePointsFetcher {

func getDevices(location: NSURL, completion handler:([ChargeDevice]?, error: NSError?) -> Void) {

let request = NSURLRequest(URL: location)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request, completionHandler: { (let data, let response, let error) -> Void in

var returnValue: NSError?

if let e = error {
returnValue = e
}

var collection: [ChargeDevice]?

if returnValue == nil {

collection = [ChargeDevice]()
var parsingError: NSError?

if let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments, error: &parsingError) as? NSDictionary {
if let chargeDevices = json.valueForKey("ChargeDevice") as? NSArray {
for chargeDevice in chargeDevices {
let device = ChargeDevice()
collection!.append(device)
}
}
}

if let e = parsingError {
returnValue = e
}

}

dispatch_async(dispatch_get_main_queue(), { () -> Void in
handler(collection, error: returnValue)
})
})

}

}

最佳答案

在我看来,您应该尽量避免 (Value?, Error?) 模式。由于两种组合是非法的,因此它会产生不良的极端情况。相反,如果可能,我建议 (Value, Error?) 任何时候 Value 有一个合理的“零”。在这种情况下,“零”是“空数组”。这非常符合 ObjC 的感觉,因为 nil NSArray 非常类似于空数组。

这样做,您可以大大简化此代码:

func getDevices(location: NSURL, completion handler:([ChargeDevice], error: NSError?) -> Void) {

// Note that error is marked "var" so we can modify it, and switched from NSError! to NSError?
let task = session.dataTaskWithRequest(request, completionHandler: { (let data, let response, var error: NSError?) -> Void in
var result = [ChargeDevice]()

if error == nil {
// Avoid NSArray and NSDictionary wherever you can in Swift
if let
json = NSJSONSerialization.JSONObjectWithData(data,
options: .AllowFragments,
error: &error
) as? [String:AnyObject],

chargeDevices = json["ChargeDevice"] as? [AnyObject] {
// map is much simpler in this case, but in your full code, for may fine fine
result = chargeDevices.map{ _ in ChargeDevice() }
}
}

dispatch_async(dispatch_get_main_queue(), { () -> Void in
handler(result, error: error)
})
})
}

请注意,在您的代码和我的代码中,不正确但有效的 JSON 不会产生任何类型的错误。它会安静地跳过 as? 调用。我可能会将所有这些 JSON 工作转移到另一个函数中,以防止这个闭包失控。

此处的另一种方法称为Result。我喜欢的例子是 Rob Rix's .尽管我在 Result 方面做了很多工作,但我个人发现很难完全过渡到 Cocoa。如果您的整个程序都使用它,并且如果您封装了大部分 Cocoa 交互,它会很有用,但我发现它作为一次性解决方案使用起来很麻烦。 (这里很多人会不同意我的看法,这只是我的经验。Result 绝对值得探索以形成您自己的意见。)

关于ios - 使用 Swift 语法在 block 中处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32095125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com