有人可以在View Controller中解释依赖注入,我们如何摆脱选项?我已经阅读了很多关于它的文章,但却无法清楚地了解它。将数据从一个VC传递到另一个VC是一种好方法吗?
class SecondVC: UIViewController {
var number: [String]?
override func viewDidLoad() {
super.viewDidLoad()
self.printNumbers()
}
func printNumbers() {
guard let number = self.number else { return }
print(number)
}
}
//+++++++ In First View Controller +++++++++++++++++
@IBAction func pushToSecondVC(_ sender: UIButton) {
let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondVC") as SecondVC
secondViewController.number = self.numbers
self.navigationController.pushViewController(secondViewController, animated: true)
}
在你的例子中,如果你只是想摆脱选项,用var number: [String]?
替换你的var number = [String]()
。这将创建一个空数组。
当您必须访问此属性时,您不再需要打开它。
你可以摆脱它们,但是你需要从代码而不是故事板启动它们。如果你想使用类似的启动方法,那么我认为你能做的最好就是改变选项以强制解包类型并拥有某种静态启动器功能,如下所示:
final class ViewController: UIViewController {
var number: [String]!
static func initiateFromStoryboard(with number: [String]) -> ViewController {
let viewController = UIStoryBoard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SecondVC") as! ViewController
viewController.number = number
return viewController
}
}
//// Use it like:
...
let vc = ViewController.initiateFromStoryboard(with: ["1","2"])
navigationController?.push(vc)
OFC。缺点是你需要密切关注number
属性,以便在使用它之前始终设置,否则你的代码会崩溃。
如果你想摆脱选项,有几种选择:
其他人建议为var
设置初始值。虽然这意味着更少的选项,但问题在于它容易忘记设置var
,这可能导致难以诊断问题。
我赞成private
含蓄地打开选项,例如
private var number: [String]!
private (set) var someBool: Bool! // private (set) makes it visible but not setable
然后在每个视图控制器(或从笔尖的故事板实例化的任何对象)上的configure
函数,例如,
configure(number: [String], someBool: Bool) {
self.number = number
self.someBool = someBool
}
如果没有设置,未打开的选项将在使用时崩溃,并且因为它们是私有的,所以不能从类本身外部意外更新它们。