此问题已经在这里有了答案:
在JavaScriptCore中,我看到大多数函数都声明为T!作为参数类型和返回类型。自T!传入并返回时假定为非nil,为什么不只将T声明为type?
例如
func evaluateScript(_ script: String!) -> JSValue!
为什么不只是
func evaluateScript(_ script: String) -> JSValue
这表明ObjC API尚未经过可空性审核,并且未应用可空性注释。没有可空性注释,编译器将不知道这些值是否为可选。在这种情况下,默认行为是将它们全部设置为!
类型,然后将问题留给调用方(唯一可行的方法是将所有?
类型都设置为,这将非常不便。) >
[Apple注释标题时,!
将消失。
同时,由您自行检查文档以确保返回值在直接使用前不能为零。
在这种情况下,底层的JSEvaluateScript
实际上可以返回nil:
@result The JSValue that results from evaluating script, or NULL if an exception is thrown.
所以您确实需要检查它。当前,编译器无法知道这一点。