【问题标题】:optional variable in class definition类定义中的可选变量
【发布时间】:2017-04-28 15:11:25
【问题描述】:

类定义中的可选项

我有一个“主模型”,我的大多数模型都从该模型继承,因此它们可以拥有配置常量

class MasterModel {

    static let apiKey = (drop.config["app","thinx-api-key"]?.string)!
    static let baseURL = (drop.config["app","base-URL"]?.string )!

}

注意力展开:( 在这种情况下,它并不是一个真正的大问题,因为没有这些常量程序将无法启动,但我还是想清理它。

guard 语句只允许在函数中,而不是在类定义中。用错误捕获定义这些常量的正确方法是什么

【问题讨论】:

  • 只要你想让它们保持静态,你基本上就被困在这种方式下。另一种方法是使它们成为非静态计算属性,并在 getter 中做任何你想做的事情。
  • 强制展开并不总是邪恶的。如果配置路径 thinx-api-keybase-URL 是“硬编码的”,则只需强制解开选项。在这种情况下,缺少的键会显示设计错误。或者在某处添加assert 行。
  • @vadian 我同意。在这种情况下,使用?? "" 是可能的。
  • @Sulthan 不,使用 ! 并打开可选的。我非常担心黑白建议永远不要强制打开可选选项,这是邪恶的。始终使用可选绑定。潜在的运行时错误和设计错误之间存在很大差异。如果您要访问应用程序包中的文件,请使用!,如果您要将表格视图单元格转换为自定义类,请使用!。如果您从日期中检索特定日期组件,请使用!。在这些情况下,欢迎发生崩溃,因为它揭示了一个不能发生的设计错误。
  • @vadian 我完全同意你的看法。在这种情况下,我也会使用!。我只是建议 ?? "" 作为一个潜在的替代方案。

标签: swift optional


【解决方案1】:

你可以给它们分配一个计算的闭包来检测配置错误

class MasterModel 
{

  static let apiKey:String  = { 
     if let result = drop.config["app","thinx-api-key"]?.string 
     { return result }
     print("MasterModel.apiKey error, missing app/thinx-api-key")
     return ""
  }()  // the () here makes the closure execute and return the value

  // ...
}

【讨论】:

    【解决方案2】:

    如果您希望程序只有在实际使用该属性时才会崩溃,您可以使用计算/惰性的:

    class MasterModel {
    
        static var apiKey: String {
            get {
                return drop.config["app","thinx-api-key"]?.string)!
            }
        }
        ...
    
    }
    

    如果在成功初始化 drop 之前调用静态初始化程序,这可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2014-01-11
      • 2014-12-16
      相关资源
      最近更新 更多