此代码以前在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'”
答案 0 :(得分:1)
.identified(by:)
已过时。正如您正确指出的那样,Xcode beta的发行说明中没有对此进行说明,但是iOS beta的发行说明中未对此进行说明,这就是为什么找不到它的原因。这有点令人困惑,因为与SwiftUI相关的更改分散在iOS 13 beta,Xcode 11 beta和macOS Catalina beta的发行说明中。
不赞成在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:)的重复,但是关于发行说明中提到的弃用之处的困惑,值得将其保留为一个单独的问题。