2014-07-08 105 views
1

嗨stackoverflow成员,在Swift中正确的错误处理

我在斯威夫特工作真的很难,现在我有一个微不足道的问题。我是一名前C#开发人员,所以直到现在错误处理尝试{} ... catch {} ...消息...完成!

现在我正在开发一个使用一些JSON API的应用程序。这一切都工作,下载JSON数据,将它们打包到我的对象,但有一个问题。正确的错误处理..

我有以下代码下载&解析JSON:

//Download & Parse JSON 
func getJSON(urlToRequest: String) -> NSDictionary { 

    var url: NSURL = NSURL(string: urlToRequest) 
    var jsonRequest: NSURLRequest = NSURLRequest(URL: url) 
    var jsonResponse: AutoreleasingUnsafePointer<NSURLResponse?> = nil 

    var error: NSError? 
    var dataValue: NSData = NSURLConnection.sendSynchronousRequest(jsonRequest, returningResponse: jsonResponse, error:&error) 

    if error.description.isEmpty { 
     var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataValue, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary 

     if error.description.isEmpty { 
      return jsonResult 
     } 
     else { 
      return NSDictionary(object: "Error: Something with parsing went wrong :(", forKey: "error") 
     } 
    } 
    else { 
     return NSDictionary(object: "Error: There was an error with your connection :(", forKey: "error") 
    } 
} 

错误部分只是暂时的,问题是我的ViewController只是调用一个函数来获取整个数据本周(天,对决等)

我这样调用它:

var rWrapper = RiotWrapper() 
let lcsWeek: Week = rWrapper.getWeek("2014-07-07") 

我getWeek方法调用3-4函数的ns,它们都可以解析与之前的响应相关的JSON数据。

好吧,长话短说问题:我想中止所有任务如果JSON或HTTP失败,并填写我的TableView只是一个错误消息,我怎么能实现这一点?

是这样的:如果发生错误 - >停止手头的一切工作 - >数据一周的回报,例如空呃..零 - >打印错误

有人能帮助我吗?如果有人根据这个话题有一些讲座,它也会很好:D

在此先感谢! Btw:对不起,我的“坏”英文

回答

0

我建议让您的函数返回一个可选的。它很容易测试,功能可以链接和快捷。

func getWeek(string : String) -> Week? { 

... 
if error { 
    return nil 
} 
} 

这可以快速评估是这样的:

if let week = getWeek("2014-07-07") { 
    // handle success case 
} else { 
    // handle nil 
} 

,并在这里获得如何串在一起的若干返回可选功能: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

+0

我在做的正是这样那一刻,它就像魅力一样。一旦你弄清楚选择权是如何工作的,那么只有一个词......惊人的:D – mort3m

1

所有的JSON解析方法,包括getWeek应该返回一个带有可选返回值和错误的元组。如果在任何时候您从JSON解析中的某个方法中收到错误,只需立即返回错误nil作为返回值。高达链中的每个方法应该从以前的方法检查错误,如果它发现一个立即返回错误:

func getWeek(string : String) -> (Week?, NSError) { 
    let (result, error) = self.otherMethod() 
    if error { 
     return (nil, error) 
    } 

    // continue happily ... 
}