繁体   English   中英

如何在函数中指定参数可以在Swift中为nil

[英]How to specify the parameter in a function can be nil in Swift

我知道我们需要在Swift中定义函数的参数,既不是隐式展开的可选参数,也不是可选的,以使其成为非零。 但是我不确定隐式展开的可选或可选之间更常见的是什么。

我正在深入观察WWDC 2014 Swift互操作性,并且与幻灯片中显示的两个示例有点混淆。 基本上它是关于在定义函数时是否应该使用隐式可选或解包参数。


视频示例

下面是WWDC 2014 Swift互操作性的截图(在09:01) 在此输入图像描述 而发言者的话是

你再次看到这是一个隐式的unwrapped可选项,因此你可以在这里传递一个nil块。

请注意, urlcompletionHandler都是隐式解包的选项,我们可以将nil传入其中。 都好!


头文件中的示例

但是当我检查UIKit UITableViewCell时,我发现大多数方法都是用可选参数定义的,例如

    init(style: UITableViewCellStyle, reuseIdentifier: String?)

基本上它表明这些参数也可以是零。

好像两者都有 而且 试着建议同样的事情(它可以是 )。

我明白了吗? 意味着我们将任何值包装到可选值(即使是nil),并且 意味着如果传入的内容是可选值,我们将解包它。 但我不确定是否应该使用 还是 哪个是传统的?


更新

看起来WWDC 2014的视频不太正确或过时 视频的屏幕截图显示了UIDocument头文件,它与当前的UIKit头不同。 看起来那个时候,所有这些都被定义为 但是现在它要么 或普通类型。

WWDC 2014 Swift深度互操作性(16:25)

WWDC的截图

当前头文件

当前头文件的屏幕截图

  • ? Optional<T>类型的快捷方式
  • ! ImplicitlyUnwrappedOptional<T>类型的快捷方式

这两种类型都实现了NilLiteralConvertible。 这意味着他们有init(nilLiteral: ())并且可以通过Void初始化。 这可以通过编译器在代码中以合成方式进行, NilLiteralConvertible nil定期分配给NilLiteralConvertible变量。 以下是从编译器角度来看的一些代码行:

 let sweetOptionalInt: Int? = nil
 let semiSweetOptionalInt: Optional<Int> = nil
 let unsweetenedOptionalInt: Optional<Int> = Optional<Int>(nilLiteral: Void)

ImplicitlyUnwrappedOptional也是如此。

所以两者都可以用nil初始化,但这些类型的行为是不同的:

  • ImplicitlyUnwrappedOptional会为您提供一个假设,当您已经提供了一个调用对象时(但之前可能是nil),所以如果不是,那么应用程序将因运行时错误而崩溃。
  • Optional将要求您提供有关如何解包变量的信息。

至于之前的互操作性,Objective-C没有办法表达变量的可空性。 这就是为什么大多数API都被转换了! 代表“如果你敢于进一步继续下去”最近Apple推出了针对Objective-C的可空性注释。 Apple使用这些注释来增加他们的API,因此现在使用Swift中具有额外可空性指导的方法更容易,更安全。

你不太对劲。 “!” 是“强制解包”操作员。 它说“这是一个可选的,但我保证当这个代码运行时,它不会是零。” 如果你错了,你会崩溃。

如果你正在编写一个带有合法nil参数的函数,请使用“?”,这使它成为一个可选项。 然后在函数的代码中,你必须处理它为零的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM