我注意到 iOS 代码中有一个烦人的模式。在实例化新的 View Controller 之后, View Controller 从以前的 View Controller 传递参数,因此您最终会得到如下示例的代码。 SecondViewController
的属性实际上不是可选的,但它们必须可以为空,因为您在 prepare(for:sender:)
中设置了它们。
class FirstController : UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
...
let vc = segue.destination as! SecondController
vc.thing = getThing()
vc.abc = "123"
...
class SecondController : UIViewController {
var thing: Thing?
var abc: String?
override func viewDidLoad() { ... }
func foo() {
guard let thing = self.thing else { return }
...
}
func bar() {
blahBlah(abc!)
实例变量似乎有两个选项...
- 让它们成为
T?
并且到处都有guard
或if let
。 - 让它们成为
T!
并希望在它们被设置之前不会调用任何东西。
所以也许我的问题可以归结为:在这里执行#2 是否安全?是否可以保证在第一个 Controller 中的 prepare(for:sender:)
之前没有对 UIViewController
调用任何内容?
编辑:我不太喜欢选项 1 的一个原因是它在几乎所有方法中都会导致 guards
,而它们可能是不必要的。对我来说似乎是代码的味道。在纯 Swift 类中,您会将 thing
和 abc
传递给 init(...)
,它们是非可选的,但是你不能在这里这样做。我们正在处理一个奇怪的情况,即 Swift 被添加到用 Objective C 设计的东西中。
最佳答案
从理论上讲,是的,如果您在准备之前设置所有这些变量,那么应该没问题。但是到处使用 guard 和 let 有什么问题呢?这就是 swift 的方式。即使现在做 2 号是安全的,谁又能说将来不安全呢?或者发生了一些我们不知道的奇怪行为,它实际上并不安全,或者你也有其他人在这个项目上工作,但他们不知道这一点,忘记在继续之前设置一个变量,然后结束导致崩溃。因此,1 号是迄今为止最安全的路线,您可以放心地休息,因为它不会因此而崩溃。
关于ios - 如何避免 Swift UIViewControllers 中的可选检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46079435/