首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使CLCircularRegion可编码

使CLCircularRegion可编码
EN

Stack Overflow用户
提问于 2020-03-05 18:42:56
回答 2查看 105关注 0票数 0

我正在努力(在操场上)使CLCircularRegion可编码。但我有一个不能修复的错误:错误:初始化器需求'init(from:)‘只能由非最终类CLCircularRegion定义中的“必需”初始化器来满足。有什么想法吗?

代码语言:javascript
复制
import UIKit
import MapKit

// MARK: - CLLocationCoordinate2D

extension CLLocationCoordinate2D: Codable {

    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(longitude)
        try container.encode(latitude)
    }

    public init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        let longitude = try container.decode(CLLocationDegrees.self)
        let latitude = try container.decode(CLLocationDegrees.self)
        self.init(latitude: latitude, longitude: longitude)
    }
}

// MARK: - CLLocationCoordinate2D

extension CLCircularRegion : Codable {

    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(identifier)
        try container.encode(center)
        try container.encode(radius)
    }

    public required init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        let identifier = try container.decode(String.self)
        let center = try container.decode(CLLocationCoordinate2D.self)
        let radius = try container.decode(CLLocationDistance.self)

        self.init(center: center, radius: radius, identifier: identifier)
    }
}

let coordinate = CLLocationCoordinate2D(latitude: 45.123, longitude: 5.678)
let region = CLCircularRegion(center: coordinate, radius: 100, identifier: "identifierTest")

// encode
if let jsonData = try? JSONEncoder().encode(region), let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)

    // decode
    if let decodedRegion = try? JSONDecoder().decode(CLCircularRegion.self, from: jsonData) {
        print(decodedRegion)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-05 19:04:05

一种解决方案是将类包装在符合可编码的结构中。

代码语言:javascript
复制
struct CodableCircularRegion : Codable {
    var region: CLCircularRegion?
    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(region?.identifier)
        try container.encode(region?.center)
        try container.encode(region?.radius)
    }

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        let identifier = try container.decode(String.self)
        let center = try container.decode(CLLocationCoordinate2D.self)
        let radius = try container.decode(CLLocationDistance.self)

        region = CLCircularRegion(center: center, radius: radius, identifier: identifier)
    }

    init(_ region: CLCircularRegion) {
        self.region = region
    }
}

编码/解码几乎相同。

代码语言:javascript
复制
if let jsonData = try? JSONEncoder().encode(CodableCircularRegion(region)), let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)

    // decode
    if let decodedRegion = try? JSONDecoder().decode(CodableCircularRegion.self, from: jsonData) {
        print(decodedRegion.region)
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-03-05 19:07:49

你不能这么做。CLCircularRegion不是final类。扩展非最终类时,只能在扩展中写入convenience初始化器。Decodable指定初始化程序必须声明为required

但是我们刚刚看到,您不能这样做,因为Swift不允许您在扩展中声明required初始化器。

顺便说一下,一般说来,扩展其他人的类型以使它们符合Codable并不是一个好主意,因为在将来的某个时候,编写该类型的人也可能添加Codable一致性,而且它们的实现很可能与您的实现不匹配,这将导致一些很难诊断的错误。

如前所述,最好的选择是将CLCircularRegion封装在符合Codable的结构中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60552086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档