SwiftUI - 使用 Identifiable 协议自定义标识符

18
我在想是否可以使用自定义标识符覆盖标准标识符。 我有一个简单的结构体:
struct MyUserData: Identifiable {
    var userId: String
    var userFirstName: String
    var userLastName: String
}

然而,如果结构体内部没有var id: ObjectIdentifier这一行,Identifiable协议将无法工作。同时,我不想使用"id"这个名称。在我的模型中,userId也是唯一的(它是UUID)。有没有办法告诉可识别协议接受"userId"而不是"id"?

谢谢!


4
换个角度思考:根据 命名指南 中的 避免不必要的单词,在您的情况下省略user这个词。声明三个结构体成员 idfirstNamelastName 即可完成。 - vadian
3个回答

30

您可以使用任何实现了Hashable协议的类型作为Identifiable所需的id属性:

extension MyUserData: Identifiable {
  var id: String { userId }
}

14

很遗憾,Identifiable 需要一个叫做 id 的属性。最简单的解决方法是在你的结构体中使用一个叫做 computed property 的 id 属性。

struct MyUserData: Identifiable {
    var userId: String
    var userFirstName: String
    var userLastName: String

    var id: String {
        userId
    }
}

2
我认为你需要这个:

我认为您需要这个:

import SwiftUI

struct MyUserData
{
    var userId: String
    var userFirstName: String
    var userLastName: String
}

struct ContentView: View {
    
    @State var arrayOfMyUserData: [MyUserData] = [MyUserData]()
    
    var body: some View {
        
        List
        {
            
            ForEach(arrayOfMyUserData, id: \.userId)  { item in
                Text("FirstName: " + item.userFirstName) + Text("  LastName: " + item.userLastName)
            }
            
        }
        .onAppear() {
            
            arrayOfMyUserData = [MyUserData(userId: "userId1", userFirstName: "willy", userLastName: "will"),
                                 MyUserData(userId: "userId2", userFirstName: "bob", userLastName: "mccarthy"),
                                 MyUserData(userId: "userId3", userFirstName: "james", userLastName: "rodriguez")
            ]
            
        }
        
        
    }
}

或者你可以使用以下方法:

struct MyUserData
{
    let userId: UUID = UUID()
    var userFirstName: String
    var userLastName: String
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接