jjzjj

swift - 使枚举(具有关联类型)可编码,成功

coder 2023-07-17 原文

我无法正确解码我的 Codable 类型。我已经阅读了一些关于制作具有关联类型的 Codable 枚举的教程。我已经搜索了拼写错误、名称不匹配或其他任何内容,但我找不到任何问题。然而,每当我尝试对这些结构进行解码时(层......这在扩展中的层上定义了一个“属性”......但层的所有其他预定义部分都被正确编码/解码),我点击decode(from decoder:) 方法中的“未找到 key ”异常。

extension Layer {

    struct Attribute: Codable {

        enum Value: Codable {

            case pulse(Double)
            case flash(Double)
            case draw(Double)

            private enum CodingKeys: String, CodingKey {
                case pulse, flash, draw
            }

            func encode(to encoder: Encoder) throws {

                var container = encoder.container(keyedBy: CodingKeys.self)

                switch self {
                case .pulse(let value):
                    try container.encode(value, forKey: .pulse)
                case .flash(let value):
                    try container.encode(value, forKey: .flash)
                case .draw(let value):
                    try container.encode(value, forKey: .draw)
                }
            }

            init(from decoder: Decoder) throws {

                let values = try decoder.container(keyedBy: CodingKeys.self)

                do {
                    let value = try values.decode(Double.self, forKey: .pulse)
                    self = .pulse(value)
                } catch (let error) {
                    print(error)
                }

                do {
                    let value = try values.decode(Double.self, forKey: .draw)
                    self = .draw(value)
                } catch (let error) {
                    print(error)
                }

                do {
                    let value = try values.decode(Double.self, forKey: .flash)
                    self = .flash(value)
                } catch (let error) {
                    print(error)
                }

                self = .draw(0.0)
            }


        }

        var value: Value

        init(value: Value) {
            self.value = value
        }
    }
}

最佳答案

我认为在解码之前,您应该首先检查解码器容器中是否存在 key 。目前,您正在这样做:

do {
    let value = try values.decode(Double.self, forKey: .pulse)
    self = .pulse(value)
} catch (let error) {
    print(error)
}

do {
    let value = try values.decode(Double.self, forKey: .draw)
    self = .draw(value)
} catch (let error) {
    print(error)
}

do {
    let value = try values.decode(Double.self, forKey: .flash)
    self = .flash(value)
} catch (let error) {
    print(error)
}

解码器容器不可能包含所有三个 key ,不是吗?

因此,在解码之前检查:

if values.contains(.pulse) {
    do {
        let value = try values.decode(Double.self, forKey: .pulse)
        self = .pulse(value)
        return // remember to return here, so you don't set self back to .draw(0.0) again!
    } catch (let error) {
        print(error)
    }
} else if values.contains(.draw) {
    do {
        let value = try values.decode(Double.self, forKey: .draw)
        self = .draw(value)
        return
    } catch (let error) {
        print(error)
    }
} else if values.contains(.flash) {
    do {
        let value = try values.decode(Double.self, forKey: .flash)
        self = .flash(value)
        return
    } catch (let error) {
        print(error)
    }
}

关于swift - 使枚举(具有关联类型)可编码,成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786573/

有关swift - 使枚举(具有关联类型)可编码,成功的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  5. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  8. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  9. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  10. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

随机推荐