为什么用T!而不是T作为函数参数和返回类型?

时间:2019-10-27 23:30:04

标签: swift javascriptcore

在JavaScriptCore中,我看到了大多数声明为T的函数!作为参数类型和返回类型。自T!传入并返回时假定为非nil,为什么不只将T声明为类型?

例如

func evaluateScript(_ script: String!) -> JSValue!

为什么不只是

func evaluateScript(_ script: String) -> JSValue

1 个答案:

答案 0 :(得分:2)

这表明ObjC API尚未经过可空性审核,并且未应用可空性注释。没有可空性注释,编译器将不知道这些值是否为可选。在这种情况下,默认行为是将它们全部设置为driver.execute_script(""" arguments[0].click() """, link) 类型,然后将问题留给调用方(唯一可行的方法是将所有!类型都设置为当前类型,这将非常不便与)。

Apple对标头进行注释时,?将消失。

同时,您可以自行检查文档以确保返回值不能为零,然后再直接使用它们。

在这种情况下,底层的!实际上可以返回nil:

JSEvaluateScript

所以您需要检查它。编译器目前无法知道。