首页 > 解决方案 > .identified(by:) 已弃用?

问题描述

此代码以前在 Xcode11 Beta 4 中工作。在最新的 Beta 5 中,我在“.identified(by:)”代码块上遇到错误。

我查看了 XCode11 Beta 5 的发行说明,但没有看到任何对 .identified(by:) 的引用被弃用。

import SwiftUI
import Combine

struct Popups: Decodable {
    let name, truckRating, upcomingLocation, cuisine, truckImage, region, 
city, state, currentLocation, numberOfRatings, truckExpense : String
}

class NetworkManager: ObservableObject {
    var objectWillChange = PassthroughSubject<NetworkManager, Never>()

    var popups = [Popups]() {
        didSet {
            objectWillChange.send(self)
        }
    }

    init() {
        guard let url = URL(string:
            "https://www.example.com/db.json") else { return }
        URLSession.shared.dataTask(with: url) { (data, _, _) in

            guard let data = data else { return }

            let popups = try! JSONDecoder().decode([Popups].self, from: data)
            DispatchQueue.main.async {
               self.popups = popups
            }


            print("Completed fetching JSON")
        }.resume()
    }
}        

struct ItemsView: View {

        @State var networkManager = NetworkManager()

        var body: some View {
            NavigationView {
                List (
                    networkManager.popups.identified(by: \.name)
                ) { popup in
                    ItemsRowView(popup: popup)
                }.navigationBarTitle(Text("Pop Ups"))
            }
        }
    }

错误消息指出“类型 '[Popups]' 的值没有成员 'identified'”

标签: swiftuixcode11

解决方案


.identified(by:)已弃用。正如您正确指出的那样,Xcode beta 的发行说明中没有说明这一点,但 iOS beta 的发行说明中没有说明,这就是您找不到它的原因。这有点令人困惑,因为与 SwiftUI 相关的更改分散在 iOS 13 beta、Xcode 11 beta 和 macOS Catalina beta 的发行说明中。

https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_beta_5_release_notes

Collection 协议上的 identify(by:) 方法已被弃用,取而代之的是专用的 init( :id:selection:rowContent:) 和 init( :id:content:) 初始化程序。(52976883, 52029393)

identified(by:)弃用发生在 beta 4 中,因此以下内容也适用:

以前的 beta 中不推荐使用的 SwiftUI API 现在已删除。(52587863)

这个问题有点像SwiftUI ForEach 'identified(by:)' is deprecated。使用 ForEach(_:id:) 或 List(_:id:),但是在发行说明中提到弃用位置的混乱值得将其作为一个单独的问题保留。


推荐阅读