You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为CoreLocation类添加Codable扩展:CLCircularRegion实现求助

实现CLCircularRegion的Codable协议支持

既然你已经搞定了CLLocationCoordinate2D的Codable扩展,那CLCircularRegion的实现就很顺了——它继承自CLRegion,所以我们需要同时处理父类和子类的所有属性。下面是完整的可运行实现:

import CoreLocation

extension CLCircularRegion: Codable {
    // 定义编码解码需要用到的键,包含父类CLRegion的属性和自身的属性
    public enum CodingKeys: String, CodingKey {
        case identifier
        case notifyOnEntry
        case notifyOnExit
        case center
        case radius
    }
    
    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        // 先编码父类CLRegion的属性
        try container.encode(identifier, forKey: .identifier)
        try container.encode(notifyOnEntry, forKey: .notifyOnEntry)
        try container.encode(notifyOnExit, forKey: .notifyOnExit)
        // 再编码自身的属性,center已经实现了Codable可以直接用
        try container.encode(center, forKey: .center)
        try container.encode(radius, forKey: .radius)
    }
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        // 解码所有需要的属性
        let identifier = try container.decode(String.self, forKey: .identifier)
        let notifyOnEntry = try container.decode(Bool.self, forKey: .notifyOnEntry)
        let notifyOnExit = try container.decode(Bool.self, forKey: .notifyOnExit)
        let center = try container.decode(CLLocationCoordinate2D.self, forKey: .center)
        let radius = try container.decode(CLLocationDistance.self, forKey: .radius)
        
        // 注意:CLCircularRegion初始化要求radius必须大于0,这里可以加个校验
        guard radius > 0 else {
            throw DecodingError.dataCorruptedError(forKey: .radius, in: container, debugDescription: "Radius must be greater than 0")
        }
        
        // 调用指定初始化器创建实例
        super.init(center: center, radius: radius, identifier: identifier)
        // 给父类的属性赋值
        self.notifyOnEntry = notifyOnEntry
        self.notifyOnExit = notifyOnExit
    }
}

关键说明:

  • CodingKeys的设计:必须包含CLRegion的identifier、notifyOnEntry、notifyOnExit,以及CLCircularRegion自身的center和radius,这样才能完整编码解码所有必要属性。
  • 编码逻辑:按父类属性到子类属性的顺序编码,保证数据结构清晰。
  • 解码逻辑:先解码所有属性值,然后校验radius的合法性(因为CLCircularRegion不允许半径为0或负数),避免初始化失败;调用父类的指定初始化器创建实例后,再手动设置notifyOnEntry和notifyOnExit这两个父类属性。
  • 依赖兼容:因为你已经实现了CLLocationCoordinate2D的Codable扩展,所以center属性可以直接解码,不需要额外处理。

内容的提问来源于stack exchange,提问作者Jakub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:05:47