gpt4 book ai didi

swift - ForEach 在一系列协议(protocol)实现上?

转载 作者:行者123 更新时间:2023-12-05 09:35:15 25 4
gpt4 key购买 nike

我开始学习 SwiftUI,因此我决定编写一个简单的密码管理器作为学习练习。我定义了一个 protocol 我的密码中有共同的属性:

protocol Secret: Codable {

var id: String { get set }
var name: String { get set }
var createdDate: Date { get set }

var favorite: Bool { get set }

var category: SecretCategory { get set }

var notes: String { get set }

init(_ id: String, name: String)
init(_ id: String, name: String, favorite: Bool)

}

然后,我定义了几个 Swift struct 来实现这个 protocol 并定义各种类型的 secret 的属性:

struct LoginSecret: Secret, Identifiable {

var id: String
var name: String
var createdDate: Date = Date()

var favorite: Bool = false

var category: SecretCategory = .login

var notes: String = ""

var username: String = ""
var encryptedPassword: String = ""

var websiteURLs: [String] = []

init(_ id: String, name: String) {
self.id = id
self.name = name
}

init(_ id: String, name: String, favorite: Bool) {
self.id = id
self.name = name
self.favorite = favorite
}
}

...和...

struct BankAccountSecret: Secret, Identifiable {

var id: String
var name: String
var createdDate: Date = Date()

var favorite: Bool = false

var category: SecretCategory = .bankAccounts

var notes: String = ""

var bankName: String = ""
var nameOnAccount: String = ""
var routingNumber: String = ""
var accountNumber: String = ""

var swift: String = ""
var iban: String = ""

var encryptedPIN: String = ""

var branchPhoneNumber: String = ""
var branchAddress: Address = Address()

init(_ id: String, name: String) {
self.id = id
self.name = name
}

init(_ id: String, name: String, favorite: Bool) {
self.id = id
self.name = name
self.favorite = favorite
}
}

这些工作得很好,我能够在 JSON 中编码/解码值以供稍后显示。但是,现在我正在处理我的 SwiftUI 代码。我想显示 List 中的每个项目,使用 SwiftUI 的 ForEach 迭代 Secret 对象的 Array。我的代码如下所示:

struct SecretsListView: View {

@State
var secrets: [Secret]

var body: some View {
NavigationView {
List {
ForEach(secrets) { secret in
<snip>
}
}
}
}
}

但是,当我编译时,我得到一个错误提示...

Value of protocol type 'Secret' cannot conform to 'Identifiable'; only struct/enum/class types can conform to protocols

没有办法遍历 Secret 对象数组吗?有没有不同的方法来完成这个?此问题是否特定于 SwiftUI 的 ForEach?我应该改用标准的 Swift Array forEach 方法吗?非常感谢您提供的任何指导。我使用 Swift 和 UIKit 有一段时间了,但 SwiftUI 是新的,我想确保我正在正确地为框架开发。

最佳答案

是的,只有 SwiftUI.ForEach需要 Identifiable一致性,Array.forEach不需要它。

ForEach还有其他几个初始化器尽管这不需要您的模型类型符合 Identifiable .

你可以使用 init(_ data: Data, id: KeyPath<Data.Element, ID>, content: @escaping (Data.Element) -> Content)例如(假设 ID 符合 HashableSecret.id 符合,因为它是 String )。

ForEach(secrets, id: \.id) { secret in
<snip>
}

另一个解决方案是将数组的索引传递给 ForEach , 那么你可以使用 ForEach(secrets.indices) , 但既然你有一个 Hashable属性(property) Secret您可以将其用作 id ,这是前一个更好的解决方案。

关于swift - ForEach 在一系列协议(protocol)实现上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65996206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com