.identified(by :)已弃用?

时间:2019-07-31 20:46:35

标签: swiftui xcode11

此代码以前在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'”

1 个答案:

答案 0 :(得分:1)

.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协议上使用identified(by :)方法   支持专用init(:id:selection:rowContent :)和   init(:id:content :)初始化程序。 (52976883,52029393)

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

  

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

这个问题有点像SwiftUI ForEach 'identified(by:)' is deprecated. Use ForEach(_:id:) or List(_:id:)的重复,但是关于发行说明中提到的弃用之处的困惑,值得将其保留为一个单独的问题。