Swift:解释NSURLSession.sharedSession()的语法语法.dataTaskWithURL

时间:2016-02-08 20:35:54

标签: ios swift networking

我是iOS World的新手。当我看到下载文件的方法。我看到这段代码:

 {
        (data, response, error) in print("task finished")
    }

我真的不明白部分:

data

response error {}个对象来自哪里?它们是哪种类型的?我熟悉Java,C#和以上结构等语言非常奇怪:方法调用后是一个let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL) let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) 代码块。我只是看到在iOS中有两种方法与上面有很大不同:

// pdfData is a CFMutableDataRef
// auxInfo is a CFDictionary
// bounds is your new size in points!
CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(pdfData);
CGContextRef context = CGPDFContextCreate(consumer, &bounds, auxInfo);
CGPDFContextBeginPage(context, NULL);
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:gc];

// Your drawing code here
// You probably want to draw your NSImage here in the bounds

[NSGraphicsContext restoreGraphicsState];
CGPDFContextEndPage(context);
CGPDFContextClose(context);
CGContextRelease(context);
CGDataConsumerRelease(consumer);

谢谢:)

1 个答案:

答案 0 :(得分:2)

{ ... }中的内容是一个匿名函数体。 (...) in中的内容是传递给函数的参数的名称。

关于“他们是哪种类型?”的问题部分这是一个非常好的问题。答案是Swift知道你引用的这个声明:

let task = NSURLSession.sharedSession().dataTaskWithURL(url: NSURL, completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void)

所以Swift已经知道三个参数的类型,因此可以选择省略类型(这里它们实际上已被省略)。

您可能会因遗漏标签completionHandler:而感到困惑。这是合法的,因为此函数是 last 参数。在这种情况下,删除标签并将匿名函数体放在函数调用括号之外是合法的(称为“尾随语法”)。

因此,您引用的代码实际上是实施dataTaskWithURL(_:completionHandler:)的法律形式。