【问题标题】:Swift: Not initialised Lazy Variable that returns ClosureSwift:未初始化返回闭包的惰性变量
【发布时间】:2018-02-24 16:11:56
【问题描述】:

我有一个初始化的惰性变量:

lazy var time: () -> String = {
    return String(describing: Date())
}

每当我拨打time() 时,我都会收到一个新日期。所以看起来它的行为完全像:

var time: () -> String {
    return {
        return String(describing: Date())
    }
}

在这种情况下,只使用惰性闭包是不好的做法,因为这样我就不必连续写两个return-statements 或者我错过了什么?

【问题讨论】:

  • 你的lazy var time 被初始化一次 - 一个闭包,当被调用时,返回一个带有当前日期的字符串。
  • @MartinR 那么在这种情况下,由于闭包的内容仍然是动态的,所以它基本上是一个我可以传递的函数?
  • 为什么不直接说func time() -> String { return String(describing: Date()) }
  • 函数 Swift 中的闭包。 – 您真正想要实现的行为是什么?
  • @Hamish 好吧,我的原始代码示例有点复杂。闭包必须传递并存储在数组中。所以一个普通的变量是不够的。

标签: swift closures lazy-initialization


【解决方案1】:

您不需要连续两个 return 语句,也不需要惰性闭包。为什么不这样做:

let time: () -> String = {
    return String(describing: Date())
}

或者只是用一个方法替换整个事情:

func time() -> String {
    return String(describing: Date())
}

您可能希望在此处使用闭包的一个原因是您希望代码的其他部分更改闭包的值。如果是这样的话,就像第一个sn-p一样,否则我认为没有什么会阻止你编写方法。你可以像闭包一样传递一个方法,因为方法一种闭包!

当初始化它们需要大量资源时,确实需要惰性变量。创建闭包往往很便宜。

【讨论】:

  • 只是为了强调这一点:将其设为lazy 是不好的做法,将其设为属性也是不好的做法。它应该是一个函数,如上一个示例所示。将其设为lazy 是不好的做法,因为没有理由延迟初始化。 (就像写lazy var x = 4;这是合法的,但毫无意义。)它不应该是财产,因为它不像财产。尽管结构没有任何变化,但每次调用它的值都是不同的。这不是“类属性”。
  • 使用String(describing:)Date 转换为String 只能在调试时使用。切勿在任何其他情况下这样做。对于所有其他情况,请使用 DateFormatter。如果向用户显示日期,请使用 date/timeStyle。例如,如果需要将固定格式发送到服务器,请使用 dateFormat
  • @maddy 你是对的。我只是出于简单的原因选择了这个例子,以证明如果惰性变量返回非闭包,惰性的内容不会像原来那样存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多