当前位置: 首页 > 面试题库 >

快速可解码可选键

高锦
2023-03-14
问题内容

(这是该问题的后续内容: 使用具有多个键的可解码协议。)

我有以下Swift代码:

let additionalInfo = try values.nestedContainer(keyedBy: UserInfoKeys.self, forKey: .age)
age = try additionalInfo.decodeIfPresent(Int.self, forKey: .realage)

我知道,如果我使用decodeIfPresent并且没有该属性,但如果它是一个可选变量,它仍然可以正确处理它。

例如,以下JSON可使用上面的代码来解析它。

{
    "firstname": "Test",
    "lastname": "User",
    "age": {"realage": 29}
}

以下JSON也适用。

{
    "firstname": "Test",
    "lastname": "User",
    "age": {"notrealage": 30}
}

但是以下操作无效。

{
    "firstname": "Test",
    "lastname": "User"
}

如何使所有3个示例正常工作?有什么类似decodeIfPresentnestedContainer


问题答案:

您可以使用以下KeyedDecodingContainer功能:

func contains(_ key: KeyedDecodingContainer.Key) -> Bool

返回一个Bool值,该值指示解码器是否包含与给定密钥关联的值。与给定键关联的值可以是适合于数据格式的空值。

例如, 请求相应的嵌套容器 之前 要检查"age"键是否存在: __

struct Person: Decodable {
    let firstName, lastName: String
    let age: Int?

    enum CodingKeys: String, CodingKey {
        case firstName = "firstname"
        case lastName = "lastname"
        case age
    }

    enum AgeKeys: String, CodingKey {
        case realAge = "realage"
        case fakeAge = "fakeage"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        self.firstName = try values.decode(String.self, forKey: .firstName)
        self.lastName = try values.decode(String.self, forKey: .lastName)

        if values.contains(.age) {
            let age = try values.nestedContainer(keyedBy: AgeKeys.self, forKey: .age)
            self.age = try age.decodeIfPresent(Int.self, forKey: .realAge)
        } else {
            self.age = nil
        }
    }
}


 类似资料:
  • 编译器错误,这是有意义的,因为它将在函数返回后调用。 但如果我将闭包设置为可选的,那么没有编译器错误,这是为什么?在函数返回后仍然可以调用闭包。

  • 我正在尝试在我的Swift应用程序中创建一个服务对象,以便更轻松地处理请求。我已经把它连接起来了,但是我可能误解了完成处理器。 我有这个函数,它只是发布到我正在运行的本地APIendpoint。 我需要做的就是把这个名字传给我在这里做的函数 但是,我现在收到此错误。 调用中缺少参数“completion”的参数 我的目标是返回< code>Response对象,这样我就可以访问它的属性,在UI中做

  • 问题内容: 我试图在Swift中声明一个需要可选闭包的参数。我声明的函数如下所示: 但是Swift抱怨说,“条件”中的绑定值必须是一个可选类型,其中声明了“ if let”。 问题答案: 您应该将可选的闭包括在括号中。这将适当地限制操作员的范围。

  • 据我所知,直线的意思是,那个变量运动得到乘以向量inputVec的x部分的绝对值,但我不明白接下来会发生什么。

  • 问题内容: 因为我不想自己做,所以我正在寻找Java的良好FFT实现。首先,我在这里使用了FFT Princeton的 这个,但是它使用了对象,而我的探查器告诉我,由于这个事实,它的速度并不是很快。所以我再次搜索了一下,发现了一个:更快的FFT Columbia 。也许你们中的一个知道另一种FFT实现?我想拥有“最好的”应用程序,因为我的应用程序必须处理大量的声音数据,并且用户不喜欢等待… ;-)

  • 在组建的团队中,我通常会在而我的快速修复方法一直是删除该文件并使用重新生成它。我没有认真考虑过这个修正的含义,因为它以前没有引起任何可察觉的问题。 删除文件并让以这种方式重新创建文件而不是手动解决冲突是否有问题?