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 中的惰性属性的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中的 MVVM 和相应的绑定 [关闭]

如何将我的自定义 ButtonStyle 添加到 swiftui3 中的快捷方式 swiftui .buttonstyle() 属性

SwiftUI 中的条件属性

观察自定义视图 SwiftUI 中的属性变化

删除嵌套属性中的元素时更新 SwiftUI 列表

可以直接使用 Publisher 作为 SwiftUI 中的 @ObjectBinding 属性吗?