简而言之,我希望能够做到这一点
var tasks = API().getTasks();
我想将方法(例如' getTasks')称为
有没有办法通过编辑以下getTasks方法来做到这一点?
现在我必须向方法发送一个块" API()。getTasks(){(tasks,error) - > ()in}"
func getTasks(callback: (tasks: Dictionary<Int, Task>, error: String?) -> ()) {
if (tasks.length != 0){
callback(tasks);
}else{
self.httpGet("tasks", params : ""){
(json, error) -> Void in
if error != nil {
} else {
for task in json {
var t = Task(dict: task);
tasks.updateValue(t, forKey: t.id)
}
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
callback(tasks: tasks, error: error);
})
}
}
以下是我的httpGet方法,该方法使用API调用的JSON进行响应。
func httpGet(method: String, callback : (Array<Dictionary<String, AnyObject>>, String?) -> Void) {
var request = NSMutableURLRequest(URL: NSURL(string: "https://www.testing.com/"+method)!)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, error) -> Void in
if error != nil {
var nothing : Array<Dictionary<String, AnyObject>> = []
callback(nothing, error.localizedDescription)
} else {
var result = NSString(data: data, encoding:NSASCIIStringEncoding)!
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as Array<Dictionary<String, AnyObject>>;
callback(json, nil)
}
}
task.resume()
}
答案 0 :(得分:1)
如果您不想将闭包传递给getTasks()
,getTasks()
将如何知道在需要时调用哪个函数?
通常有两种方法:
getTasks()
是类的实例方法。您可以为接受闭包并保存它的类提供适当的init
方法,并且在getTasks()
中,您可以调用已保存的闭包getTasks()
是类的实例方法,用于定义getTasks()
调用的基本方法。您可以从此类继承并覆盖基本方法以自定义所执行的操作。getTasks()
是一个“类方法”。在这种情况下,您可以选择较少的自定义选项。我不建议使用此选项,但可能会有一些getTasks()
可以检查的全局/类属性。选项1通常是功能性程序员的首选; OOP程序员通常首选选项2。选项3不太受欢迎,但我看过这样的代码并且很难维护。你经常在像C这样的语言中看到它,但即使在C语言中,也有更好的方法可以解决这个问题。
我也很好奇为什么你不喜欢你所问的方法 - 实际上,这是一种非常常见的方法,我认为它适用于大多数函数式编程模式。你不喜欢它吗?