0

假设我们有这个 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?” 在 viewDidLoad 中。如果 MainViewController 没有设置该属性,我可能会有一个缺少文本的视图。

  • “String!”:更简单的代码,但如果 MainViewController 未设置该属性,应用程序会崩溃。

对于可能出现的错误,最好的选择是什么:显示不完整的视图或崩溃并获取错误日志?最后一个对用户来说是不愉快的,但它有助于跟踪错误,特别是在开发时。

我认为一个好的解决方案是使用“字符串?” 使用 assert(),然后应用程序只会在开发时崩溃。其他建议?

4

2 回答 2

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.0guard中的语句有很大帮助),但这样可以确保您的代码是安全的。

可能很诱人String!,但是如果出于某种原因您将来停止使用 segues 并且将通过 xibs 或通过 Apple 引入的一些新方法以编程方式加载您的视图控制器怎么办?试想一下,找到所有那些隐式展开的变量并修复它们会有多痛苦!

于 2015-06-25T00:56:16.393 回答
0

我同意你最初的想法?我认为这是正确的做法。如果适用,Andriy 关于默认参数的建议也是一个不错的建议。

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

于 2015-06-27T04:07:55.077 回答