Swift中的属性是否应该在我的UIViewControllers中隐式解包?

时间:2015-06-24 17:36:45

标签: null swift error-detection

假设我们有这个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(),然后应用程序只会在开发时崩溃。其他建议?

2 个答案:

答案 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关于默认参数的建议也很好。

您的代码应表达您对其中所有可能情况的理解。如果您不确定自己将在访问文本时定义文本,那么应该是?没有理由隐藏它。这将为其他开发人员提供有关可能的复杂性的足够指导,因此他们将能够适当地使用您的代码。即使用户无法继续处理不完整的数据,开发人员仍然可以处理这种情况并允许用户优雅地离开应用程序。我会避免的!以所有成本作为运行时错误的潜在点,这将带来负面的用户体验以及之后难以调试。