如何使用 SwiftUI 中的扩展将 Hashable 协议添加到 CLLocationCoordinate2D

Posted

技术标签:

【中文标题】如何使用 SwiftUI 中的扩展将 Hashable 协议添加到 CLLocationCoordinate2D【英文标题】:How to add the Hashable protocol to CLLocationCoordinate2D using an extension in SwiftUI 【发布时间】:2021-02-19 22:41:07 【问题描述】:

所以我有一个自定义结构,其中一个属性为 String 类型,另一个属性为 CLLocationCoordinate2D。显然,String 符合 Hashable,如果我可以扩展 CLLocationCoordinate2D 以符合 Hashable,我的自定义结构也将是 Hashable。这是我扩展 CLLocationCoordinate2D 的尝试:

extension CLLocationCoordinate2D 
    static func == (lhs: Self, rhs: Self) -> Bool 
        return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
    
    
    func hash(into hasher: inout Hasher) 
        hasher.combine(self.latitude) //wasn't entirely sure what to put for the combine parameter but I saw similar things online
    

【问题讨论】:

【参考方案1】:

您需要明确声明Hashable

extension CLLocationCoordinate2D: Hashable 
    public static func == (lhs: Self, rhs: Self) -> Bool 
        return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude
    
    
    public func hash(into hasher: inout Hasher) 
        hasher.combine(latitude)
        hasher.combine(longitude)
    

【讨论】:

【参考方案2】:

CoreLocation 和 MapKit 尚未正确 Swiftified。我建议为他们重用功能。

extension CLLocationCoordinate2D: HashableSynthesizable  
extension MKCoordinateRegion: HashableSynthesizable  
extension MKCoordinateSpan: HashableSynthesizable  
/// A type whose `Hashable` conformance could be auto-synthesized,
/// but either the API provider forgot, or more likely,
/// the API is written in Objective-C, and hasn't been modernized.
public protocol HashableSynthesizable: Hashable  

public extension HashableSynthesizable 
  static func == (hashable0: Self, hashable1: Self) -> Bool 
    zip(hashable0.hashables, hashable1.hashables).allSatisfy(==)
  

  func hash(into hasher: inout Hasher) 
    hashables.forEach  hasher.combine($0) 
  


private extension HashableSynthesizable 
  var hashables: [AnyHashable] 
    Mirror(reflecting: self).children
      .compactMap  $0.value as? AnyHashable 
  

【讨论】:

以上是关于如何使用 SwiftUI 中的扩展将 Hashable 协议添加到 CLLocationCoordinate2D的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 使列表分隔线扩展到触摸屏边缘

SwiftUI:如何将内容阻止程序应用于 chrome?

扩展视图时 SwiftUI 预览崩溃

在 SwiftUI 中使用 FileManager 列出文档

如何让 SwiftUI 界面可扩展?

将 SwiftUI 视图转换为 NSImage