我可以在 Swift (4) 的视图控制器中对隐式展开的选项进行编译时检查吗?
Can I get compile-time checks for implicitly unwrapped optionals in view controllers in Swift (4)?
我有一个 class 看起来像这样(简化):
class GuideViewController: UIViewController, StoreSubscriber {
var tileRenderer: MKTileOverlayRenderer! // <------ this needs to be set by whoever instantiates this class
override func viewDidLoad() {
super.viewDidLoad()
...
}
}
我的应用程序使用此 GuideViewController class 来显示许多不同样式的地图,因此 tileRenderer
实例变量可以有许多不同的值。
我想要编译时保证 tileRenderer
永远不会为零,而不是使用隐式展开的可选。
我怎样才能做到这一点?
到目前为止我已经考虑过但不确定的事情
- 在 GuideViewController 的
init()
方法中设置 tileRenderer
。这是我的第一直觉 this answer 暗示这是不可能的,或者是反模式。
- 在
viewDidLoad()
中设置 tileRenderer
。这似乎需要使用绕过编译时检查的隐式解包选项。另外,我的印象是 viewDidLoad()
在应用程序的生命周期中只为视图控制器调用一次
实例化VC后手动设置tileRenderer
。例如,
let vc = self.storyboard?.instantiateViewController(withIdentifier: "GuideViewController")
vc.tileRenderer = MKTileOverlayRenderer(...) // <----- can I make the compiler force me to write this line?
navigationController?.pushViewController(vc!, animated: true)
请原谅我问这么天真的问题——我对 iOS 开发还很陌生。
不可能进行编译时检查,因为这需要编译器完全分析程序的流程。
您不能将 属性 设置为非可选的(好吧,您可以 - 参见第 4 点),因为这需要自定义初始化程序,而这实际上不适用于 UIViewController
子类。
您有几个选择:
如果是 nil
使用隐式展开的可选并在运行时崩溃 - 希望开发人员能够快速识别他们的错误
在合适的点(例如viewWillAppear
)检查nil
并向控制台发出警告,然后在您尝试访问该值时崩溃或call fatalError
- 这会给开发人员更多关于他们做错了什么的提示
使用可选的并在使用前解包
使用非可选值并提供默认值
选项 4 可能是最佳选项;提供一个不执行任何操作的默认渲染器(或者可能向控制台日志发出警告,表明它是默认渲染器并且开发人员需要提供一个)。
我有一个 class 看起来像这样(简化):
class GuideViewController: UIViewController, StoreSubscriber {
var tileRenderer: MKTileOverlayRenderer! // <------ this needs to be set by whoever instantiates this class
override func viewDidLoad() {
super.viewDidLoad()
...
}
}
我的应用程序使用此 GuideViewController class 来显示许多不同样式的地图,因此 tileRenderer
实例变量可以有许多不同的值。
我想要编译时保证 tileRenderer
永远不会为零,而不是使用隐式展开的可选。
我怎样才能做到这一点?
到目前为止我已经考虑过但不确定的事情
- 在 GuideViewController 的
init()
方法中设置tileRenderer
。这是我的第一直觉 this answer 暗示这是不可能的,或者是反模式。 - 在
viewDidLoad()
中设置tileRenderer
。这似乎需要使用绕过编译时检查的隐式解包选项。另外,我的印象是viewDidLoad()
在应用程序的生命周期中只为视图控制器调用一次 实例化VC后手动设置
tileRenderer
。例如,let vc = self.storyboard?.instantiateViewController(withIdentifier: "GuideViewController") vc.tileRenderer = MKTileOverlayRenderer(...) // <----- can I make the compiler force me to write this line? navigationController?.pushViewController(vc!, animated: true)
请原谅我问这么天真的问题——我对 iOS 开发还很陌生。
不可能进行编译时检查,因为这需要编译器完全分析程序的流程。
您不能将 属性 设置为非可选的(好吧,您可以 - 参见第 4 点),因为这需要自定义初始化程序,而这实际上不适用于 UIViewController
子类。
您有几个选择:
如果是
nil
使用隐式展开的可选并在运行时崩溃 - 希望开发人员能够快速识别他们的错误在合适的点(例如
viewWillAppear
)检查nil
并向控制台发出警告,然后在您尝试访问该值时崩溃或callfatalError
- 这会给开发人员更多关于他们做错了什么的提示使用可选的并在使用前解包
使用非可选值并提供默认值
选项 4 可能是最佳选项;提供一个不执行任何操作的默认渲染器(或者可能向控制台日志发出警告,表明它是默认渲染器并且开发人员需要提供一个)。