有人可以解释一下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)
}
答案 0 :(得分:0)
在您的示例中,如果您只是想摆脱可选项,请将clickButton: function(button,callback)
{
let el;
el=element(by.css(button));
el.click().then(function () {
callback();
});
},
替换为var number: [String]?
。这将创建一个空数组。
当您必须访问此属性时,您不再需要打开它。
答案 1 :(得分:0)
您可以摆脱它们,但是随后您需要从代码而不是故事板中启动它们。 如果您想使用类似的启动方法,我认为您最好的方法是更改可选参数以强制展开类型并具有某种静态启动器功能,如下所示:
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
属性的设置,否则代码将崩溃。
答案 2 :(得分:0)
如果要摆脱可选选项,您有几种选择:
答案 3 :(得分:0)
这里的其他建议建议为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
}
未包装的可选选项如果未设置将在使用时崩溃,并且由于它们是私有的,因此不能从类本身之外意外地更新它们。