【问题标题】:SwiftUI Initialzier requires String conform to IdentifiableSwiftUI Initialzier 要求 String 符合 Identifiable
【发布时间】:2021-06-14 20:54:20
【问题描述】:

我第一次尝试编写一些 SwiftUI 代码,但在尝试制作简单的表格视图时遇到了问题。在此代码中teamsString 的数组,但List 给了我以下错误:Initializer 'init(_:rowContent:)' requires that 'String' conform to 'Identifiable'

var body: some View {
        let teams = getTeams()
        Text("Hello there")
        List(teams) { team in
            
        }
        
    }

有人知道这是什么意思吗?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    List 的参数必须是唯一的,这就是Identifiable 协议的目的

    你可以的

    List(teams, id: \.self) { team in
    

    但随后有责任确保字符串是唯一的。否则,您将得到意想不到的行为。

    更好的是使用具有唯一id 且符合Identifiable 的自定义结构

    【讨论】:

    • 我担心向 SwiftUI 新手提出这个建议会导致立即遭到抨击,类似于向新的 Swift 开发人员教授 !
    【解决方案2】:

    Apple 首选的方法是添加一个字符串扩展:

    extension String: Identifiable {
        public typealias ID = Int
        public var id: Int {
            return hash
        }
    }
    

    请参阅此代码示例以供参考: https://github.com/apple/cloudkit-sample-queries/blob/main/Queries/ContentView.swift

    【讨论】:

      【解决方案3】:

      我假设getTeams() 返回一个[String](又名Array<String>)。

      正如错误所暗示的,问题在于字符串无法识别。但不仅仅是在“它们不符合Identifiable 协议”的意义上,而是在更广泛的意义上:如果两个字符串是"foo",则一个与另一个无法区分;它们是相同的。

      这对于List 视图是不可接受的。想象一下,您有一个包含 "foo" 条目的列表,并且用户拖动以重新排列其中一个。 List 如何区分它们,知道两者中的哪一个应该移动?

      要解决此问题,您需要使用替代身份来源以允许 List 区分其所有条目。

      您应该观看"Demystify SwiftUI" talk from this year's WWDC。它详细介绍了这个主题。

      【讨论】:

        【解决方案4】:

        如果您尝试查看“结构”类型的项目的“列表” 将结构更改为使用“可识别”:

        我的结构:

         struct Post : Identifiable{
            let id = UUID()
            let title: String
        }
        

        我的清单:

        let posts = [
            Post( title: "hellow"),
            Post( title: "I am"),
            Post( title: "doing"),
            Post( title: "nothing")
        ]
        

        然后您可以查看您的列表:

        List(posts){post in
           Text(post.title
        }
        

        【讨论】:

          猜你喜欢
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 2020-08-10
          • 2021-02-10
          • 1970-01-01
          • 2020-05-20
          • 1970-01-01
          • 2021-09-04
          相关资源
          最近更新 更多