Ios 为什么NSSession dataTaskWithRequest completion处理程序对错误参数使用隐式展开的可选选项?

Ios 为什么NSSession dataTaskWithRequest completion处理程序对错误参数使用隐式展开的可选选项?,ios,swift,Ios,Swift,我是斯威夫特的新手,我遇到了一些让我困惑的事情。根据,dataTaskWithRequest方法签名如下: func dataTaskWithRequest(_ request: NSURLRequest, completionHandler completionHandler: ((NSData!, NSURLResponse!, NSError!) -> Voi

我是斯威夫特的新手,我遇到了一些让我困惑的事情。根据,dataTaskWithRequest方法签名如下:

func dataTaskWithRequest(_ request: NSURLRequest,
   completionHandler completionHandler: ((NSData!,
                              NSURLResponse!,
                              NSError!) -> Void)?) -> NSURLSessionDataTask

我的问题是,为什么completionHandler的NSError参数是隐式展开的可选参数,而该参数为nil是完全有效的?我本以为它会被宣布为NSError?可选。有什么我遗漏的吗?

目前,iOS SDK中存在许多此类不一致

在向Swift过渡的过程中,它目前处于不断变化的状态

记住所有这些API都是用Objective C编写的。 我还可以想到许多其他例子,例如NSURL等

随着API的成熟和完善,所有这些都变得越来越好,但是从ObjC到Swift的自动转换留下了一些怪癖,如上面提供的示例


苹果公司正在审查每一个类别,并对API进行适当的修改,包括对Optionals的最佳实践方法,尽管它们尚未完成。

因此,总而言之,这可能不是iOS SDK开发人员做出的“深思熟虑”的决定,而是将Objective C API全面转换为Swift的结果?确切地说,他们实现了API转换的自动化,并且,在可能无法自动确定要做什么的情况下,默认使用隐式展开的选项。看看CellForRowAtIndexPath,它在API进程中更改了几次。很酷,谢谢。最后一件事:您是否同意声明可以合法地作为nil传递的函数参数的正确方法是将其声明为可选的?(我主要对此感到好奇,并不是为了指出iOS SDK的错误,而是想弄清楚如何正确地声明自己的函数参数)绝对正确。在Swift中,如果可能为零,则它必须是可选的。