gpt4 book ai didi

swift - 展开可选实例属性的最佳位置——创建时或调用时?

转载 作者:搜寻专家 更新时间:2023-11-01 06:15:14 24 4
gpt4 key购买 nike

当你想创建一个实例属性,它有一个你想在 self 可用后初始化的初始化器时,你通常会把它变成一个变量并将它声明为一个选项,就像这样:

var mapView: MGLMapView?

然后当 self 可用时,您将初始化它,如下所示:

mapView = MGLMapView(frame: view.bounds)

但是,当你稍后调用mapView时,你应该用还是!来调用它?

mapView?.userTrackingMode = .follow
mapView!.userTrackingMode = .follow

或者应该在第一次创建属性时立即解包,如下所示:

var mapView: MGLMapView!

然后放弃使用 ?! 。所有三种可能性都将编译并运行,那么在必须选择时是否有最佳实践或经验法则可遵循?

最佳答案

仅当您将在 init 之外但在所有其他代码访问之前分配一个值时,才应将变量声明为隐式展开(使用 !)变量,变量一定会被赋值。

这方面的典型示例是 View Controller 中的 socket 。这些值在 init 之后但在所有其他代码使用它们之前分配。在这种情况下,awakeFromNibviewDidLoad 是典型的初始化位置。由于所有其他代码都可以安全地假定变量具有非 nil 值,因此使用隐式展开的变量是有意义的。

对于“普通”可选变量(在声明中使用 ?),你永远不应该强制解包这些值,因为变量是可选变量的全部原因是因为它可能是 nil.

在这些情况下,始终使用条件绑定(bind)(if let)或可选链接。

在您的示例中,您很可能会在 viewDidLoad 方法中设置 map View ,因此将其声明为 var mapView: MGLMapView!。然后你可以引用 mapView 就像它不是你代码中其他任何地方的可选一样。只需确保在 viewDidLoad 初始化它之前不要尝试访问 mapView

另一种选择是将该属性设置为延迟加载的属性。那么您不需要使用 ?! 声明它。

关于swift - 展开可选实例属性的最佳位置——创建时或调用时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46720576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com