Swift - 结构类型不符合协议

时间:2021-03-26 16:38:48

标签: ios swift

我正在学习 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

1 个答案:

答案 0 :(得分:3)

Store 有一个属性,它是一个 Category 数组。我猜 Category 不符合 EquatableHashable,因此 Swift 无法合成一致性。

Landmark 包含所有符合 EquatableHashable 的属性,因此它可以合成 Landmark 的一致性。

有两种方法可以使 Store 符合要求。

  1. 使 Category 符合这两个协议。然后 Swift 可以合成 Store 的一致性。

  2. 通过实现 HashableEquatable

    Store 显式实现 static func == (lhs: Store, rhs: Store) -> Boolfunc hash(into: inout Hasher) 的一致性

根据 Category 的实现,最简单的解决方案可能是:

extension Category: Hashable, Equatable { }
相关问题