我正在学习 Swift,但我对基础知识有点卡。从 Apple 下载了一个示例项目,但仍然看不出这两者之间有什么区别:
我的结构:
import Foundation
import SwiftUI
import CoreLocation
struct Store: Hashable, Codable, Identifiable {
var id: Int
var name: String
var categories: [Category]
private var logoName: String
var logo: Image {
Image(logoName)
}
private var coordinates: Coordinates
var locationCoordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(
latitude: coordinates.latitude,
longitude: coordinates.longitude)
}
struct Coordinates: Hashable, Codable {
var latitude: Double
var longitude: Double
}
}
示例:
import Foundation
import SwiftUI
import CoreLocation
struct Landmark: Hashable, Codable, Identifiable {
var id: Int
var name: String
var park: String
var state: String
var description: String
var isFavorite: Bool
private var imageName: String
var image: Image {
Image(imageName)
}
private var coordinates: Coordinates
var locationCoordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(
latitude: coordinates.latitude,
longitude: coordinates.longitude)
}
struct Coordinates: Hashable, Codable {
var latitude: Double
var longitude: Double
}
}
第一个失败:
"Type 'Store' does not conform to protocol 'Equatable'"
"Type 'Store' does not conform to protocol 'Hashable'"
第二个工作正常。
有什么区别? Xcode 中的某处是否有设置? :)
(样本来自:https://developer.apple.com/tutorials/swiftui/handling-user-input)
答案 0 :(得分:3)
Store
有一个属性,它是一个 Category
数组。我猜 Category
不符合 Equatable
或 Hashable
,因此 Swift 无法合成一致性。
Landmark
包含所有符合 Equatable
和 Hashable
的属性,因此它可以合成 Landmark
的一致性。
有两种方法可以使 Store
符合要求。
使 Category
符合这两个协议。然后 Swift 可以合成 Store
的一致性。
通过实现 Hashable
和 Equatable
Store
显式实现 static func == (lhs: Store, rhs: Store) -> Bool
和 func hash(into: inout Hasher)
的一致性
根据 Category
的实现,最简单的解决方案可能是:
extension Category: Hashable, Equatable { }