我在SwiftUI中有以下代码:

struct VideoList: View {
  @State private var pathList:[String] = []

   var body: some View {
     List($pathList, id: \.self) { path in
         VideoListCell(path: path)
     }
  }

然后,

   struct VideoListCell: View {
       @Binding var path:String
       private var dateFormatter:DateFormatter = DateFormatter()
       ....
   }

但我得到了错误(它在没有dateFormatter的情况下构建良好):

 'VideoListCell' initializer is inaccessible due to 'private' protection level

如果我像这样声明一个初始化式:

    init(path:String) {
       self.path = path
    }

我得到以下错误:

 'self' used before all stored properties are initialized

  Return from initializer without initializing all stored properties

推荐答案

dateFormatter属性是一个var,所以它作为可选参数包含在 struct 的默认成员初始化器中(因为你初始化了它).因为它是private,默认的memberwise初始化器也变成私有的.

你应该把它设为let个常量.现在,它将不再包含在默认的成员级初始化器中,因为它已经初始化,它的值不能更改.

如果您需要为它分配另一个日期格式化程序(非常奇怪),您也可以将其设置为@State var.请注意,如果private var@State包装在一起,则它们不会包含在成员初始化程序中.这是因为State.wrappedValue具有非Mutations 的定位器,因此衬垫_dateFormatter可以是let,即

private let _dateFormatter = State<DateFormatter>(wrappedValue: DateFormatter())
var dateFormatter: DateFormatter {
    get { _dateFormatter.wrappedValue }
    nonmutating set { _dateFormatter.wrappedValue = newValue }
}

最后但并非最不重要的是,我建议将类型改为Date.FormatStyle

private let format: Date.FormatStyle = .dateTime // or some custom format

Text等这样的SwiftUI视图可以采用这样的值并自动格式化Date.

Text(Date(), format: format)

或者更一般地,泛型类型参数T: FormatStyle where T.FormatInput == Date, T.FormatOutput == String.如果需要解析,请使用ParseableFormatStyle.

Swift相关问答推荐

如何更新Square Order?

在Swift中,是否只有iOS版本超过15才能导入Swift包?

通常从数组调用的SWIFT静态协议函数

为什么这个快速代码不显示文本字段?

如何在 Vapor 中制作可选的查询过滤器

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

如何在visionOS中将模型锚定在用户头部上方?

macOS SwiftUI: 如何触发删除一个项目?

从 Obj-C 函数返回 swift 类的不兼容指针类型

为什么我的 tableView 没有推送到 tableView 内的 detailViewController?

避免 `(())` 显式指定 Void 类型的枚举关联值

Swift 并发:@MainActor 对象上的通知回调

我如何遵守与演员的协议?

如何裁剪图像 3:4 ?迅速

`IndexSet` 永远不会是空的?

RxSwift:share() 替代方案,保证upstream 的单一订阅

符合协议要求委托变量在 ios13 中可用

Swift 动画 WithDuration 语法是什么?

Swift中方法的弃用和其他属性,如何?

快速延迟加载属性