SwiftUI 中的惰性属性
Posted
技术标签:
【中文标题】SwiftUI 中的惰性属性【英文标题】:Lazy property in SwiftUI 【发布时间】:2020-04-28 08:49:49 【问题描述】:您好,我在制作惰性属性方面需要帮助。
我有这个代码:
lazy var dateFormat: DateFormatter =
let formatter = DateFormatter()
formatter.locale = NSLocale.current
formatter.dateFormat = "dd/MM/YYYY hh:mm"
return formatter
()
当在Text(date, formatter: self.dateFormat)
中使用它时
我收到此错误Cannot use mutating getter on immutable value: 'self' is immutable
【问题讨论】:
您将其声明为 let, use var。 可以做@State lazy var dateFormat ..... ? 【参考方案1】:您可以使用静态而不是惰性。
struct Formatter: View
var date = Date()
private static var dateFormat: DateFormatter =
let formatter = DateFormatter()
formatter.locale = NSLocale.current
formatter.dateFormat = "dd/MM/YYYY hh:mm"
return formatter
()
var body: some View
Text("\(date, formatter: Self.dateFormat)")
【讨论】:
致所有阅读本文的人。请像这样使用格式化程序: formatter.setLocalizedDateFormatFromTemplate("dd/MM/YYYY hh:mm") 您还将免费获得日期组件的正确方向。 @Tobias 模板不是日期格式。组件的顺序与分隔符一样无关紧要。它们将被忽略。【参考方案2】:关于在 SwiftUI 中使用日期格式化程序的答案并没有错,但它们都没有正确处理本地化的日期格式。如果您不打算使用任何预定义的日期格式,您应该使用DateFormatter
实例函数setLocalizedDateFormatFromTemplate(_ dateFormatTemplate: String)
。
这让您可以传递您想要的格式 - 并巧妙地应用该格式的正确本地化版本:您可以在 Swift Playground 中试用:
您可以看到使用正确的语言环境来呈现日期字符串。
【讨论】:
***.com/questions/61476199/… 上面的评论也适用于此。将它们添加到初始字符串是没有意义的【参考方案3】:你不能在 SwiftUI 视图中使用lazy
,如果你想在这种特定情况下可以使用静态,如下例所示
struct TestView: View
static var dateFormat: DateFormatter =
let formatter = DateFormatter()
formatter.locale = NSLocale.current
formatter.dateFormat = "dd/MM/YYYY hh:mm"
return formatter
()
// ... other code
// use as TestView.dateFormat
作为替代,您可以将lazy var dateFormat
移动到相关的视图模型类中并从相应的实例中使用它。
【讨论】:
以上是关于SwiftUI 中的惰性属性的主要内容,如果未能解决你的问题,请参考以下文章
如何将我的自定义 ButtonStyle 添加到 swiftui3 中的快捷方式 swiftui .buttonstyle() 属性