假设我们有这个viewController
public class DetailsViewController : UITableViewController
{
public var text : String;
public override func viewDidLoad ( )
{
// do something with text
}
}
我们有另一个控制器通过segue
推送前一个控制器public class MainViewController : UITableViewController
{
...
public override func prepareForSegue ( segue : UIStoryboardSegue, sender : AnyObject? )
{
if ( segue.identifier == "detailsSegue" )
{
let selectPatientController = segue.destinationViewController as! DetailsViewController;
selectPatientController.text = "I'm Iron Man";
}
}
}
由于MainViewController没有实例化DetailsViewController,我不能保证会设置“text”。所以我可以将它声明为“String?”或“字符串!”。
“String?”:我必须写“.text?”在viewDidLoad中。如果MainViewController没有设置属性,我可能会有一个缺少文本的视图。
“String!”:更简单的代码,但如果MainViewController没有设置属性,应用程序崩溃。
可能出现错误的最佳选择是:显示不完整的视图或崩溃并获取错误日志?最后一个对用户来说是不愉快的,但它有助于跟踪错误,特别是在开发时间。
我认为一个好的解决方案是使用“String?”使用assert(),然后应用程序只会在开发时崩溃。其他建议?
答案 0 :(得分:1)
我会这样做。
public class DetailsViewController : UITableViewController
{
public var text : String = "Default text or empty string" {
didSet {
//property was just changed so you can update your UI with new text
//for example (you need to define this function yourself)
self.updateWhenTextChanged()
}
}
public override func viewDidLoad ( )
{
// do something with text
}
}
将其保留为String?
。打开它可能会很痛苦(虽然在Swift 2.0 guard
语句中有很多帮助),但这样你就可以确保你的代码是安全的。
放置String!
可能很诱人,但如果出于某种原因你将来停止使用segue并以编程方式加载视图控制器,通过xib或通过Apple引入的一些新方法怎么办?想象一下,找到所有隐藏的未包装变量并修复它们会有多痛苦!
答案 1 :(得分:0)
我同意你最初的想法?我认为这是正确的方法。如果适用,Andriy关于默认参数的建议也很好。
您的代码应表达您对其中所有可能情况的理解。如果您不确定自己将在访问文本时定义文本,那么应该是?没有理由隐藏它。这将为其他开发人员提供有关可能的复杂性的足够指导,因此他们将能够适当地使用您的代码。即使用户无法继续处理不完整的数据,开发人员仍然可以处理这种情况并允许用户优雅地离开应用程序。我会避免的!以所有成本作为运行时错误的潜在点,这将带来负面的用户体验以及之后难以调试。