我注意到iOS代码中存在令人讨厌的模式。在实例化新的视图控制器之后,视图控制器从先前的视图控制器传递参数,因此您最终得到的代码如下例所示。 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是否安全?是否保证在第一个控制器中UIViewController
之前prepare(for:sender:)
上没有调用任何内容?
编辑:我不喜欢选项1的一个原因是它几乎在所有方法中都会导致guards
,这可能是不必要的。好像给我一个代码味道。在纯粹的Swift课程中,您可以将thing
和abc
传递给init(...)
,并且它们不是可选的,但您无法在此处执行此操作。我们正处理一个奇怪的情况,其中Swift被添加到Objective C中设计的东西。
答案 0 :(得分:0)
从理论上讲,如果你在准备之前设置了所有这些变量那么它应该没问题。但是使用后卫和让它到处都有什么问题?这就是斯威夫特的方式。即使现在做2号是安全的,谁说它将来不安全?或者我们不知道的一些奇怪的行为发生,它实际上并不安全,或者你也有其他人正在研究这个项目,他们也不知道这个并忘记在segueing之前设置其中一个变量并结束导致崩溃。因此,1号是迄今为止最安全的路线,您可以放心地知道它不会因此而崩溃。