草庐IT

swift - 枚举关联值令人困惑

coder 2023-09-16 原文

当我尝试使用 func obj func 时,出现错误:

Cannot invoke 'obj' with an argument list of type '(message: (QueueAddable))'

我对 Swift 类型感到困惑。 Obj func 用于获取解码的具体类型。

protocol QueueAddable: Encodable {
    var playlistsCollection:String? { get }
    var playlists: [String]? { get }
}

struct Playlist: QueueAddable {
    var playlistsCollection:String? {
        return "id"
    }
    var playlists: [String]? {
        return ["id", "id2"]
    }
    private enum CodingKeys:String,CodingKey {
        case playlistsCollection
        case playlists
    }

    public func encode(to encoder: Encoder) throws {
        var values = encoder.container(keyedBy: CodingKeys.self)
        try values.encode(playlistsCollection, forKey: Playlist.CodingKeys.playlistsCollection)
        try values.encode(playlists, forKey: .playlists)
    }
}

func obj<Q>(message: Q) where Q: QueueAddable {
    let encoder = JSONEncoder()
    let data = try! encoder.encode(message)
}

enum SomeEnum {
    case playlist(QueueAddable)
    func doSome() throws -> Data {
        switch self {
        case .playlist(let queueAddable):
            let encoder = JSONEncoder()

            // Error on the following line:
            obj(message: queueAddable)
            return Data()
        }
    }
}

let playlist = Playlist()
let data = try SomeEnum.playlist(playlist).doSome()

最佳答案

我认为问题在于函数需要类型而不是协议(protocol)。如果您使用实现该协议(protocol)的类型使枚举通用,它将起作用。

像这样更改枚举的前两行:

enum SomeEnum<Q : QueueAddable> {
case playlist(Q)

我在以下 Playground 进行了测试:

import Foundation

protocol QueueAddable: Encodable {
    var playlistsCollection:String? { get }
    var playlists: [String]? { get }
}

struct Playlist: QueueAddable {
    var playlistsCollection:String? {
        return "id"
    }
    var playlists: [String]? {
        return ["id", "id2"]
    }
    private enum CodingKeys:String,CodingKey {
        case playlistsCollection
        case playlists
    }

    public func encode(to encoder: Encoder) throws {
        var values = encoder.container(keyedBy: CodingKeys.self)
        try values.encode(playlistsCollection, forKey:      Playlist.CodingKeys.playlistsCollection)
        try values.encode(playlists, forKey: .playlists)
    }
}

func obj<Q>(message: Q) where Q: QueueAddable {
    let encoder = JSONEncoder()
    let data = try! encoder.encode(message)
}

enum SomeEnum<Q : QueueAddable> {
    case playlist(Q)
    func doSome() throws -> Data {
        switch self {
        case .playlist(let queueAddable):
            let encoder = JSONEncoder()

            // No longer error on the following line:
            obj(message: queueAddable)
            return Data()
        }
    }
}

let playlist = Playlist()
let data = try SomeEnum.playlist(playlist).doSome()

希望对您有所帮助!

关于swift - 枚举关联值令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228267/

有关swift - 枚举关联值令人困惑的更多相关文章

  1. 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].有没有一种方法可以

  2. 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列,在这种情况下

  3. 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

  4. 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”,看起来

  5. ruby-on-rails - 如何在 Rails 4 中搜索关联 - 2

    我想获取主题名称与搜索关键字匹配的所有配置文件。现在我正在加载所有配置文件。我需要知道如何实现它。非常感谢任何帮助。配置文件.rbhas_many:categorizationshas_many:subjects,through::categorizations主题.rbhas_many:categorizationshas_many:profiles,through::categorizations分类.rbbelongs_to:profilebelongs_to:subjectviews/search/index.html.erb#searchform'get'do%>nil%>#

  6. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  7. ruby-on-rails - rails 多态关联(遗留数据库) - 2

    我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint

  8. ruby - 引用具有指定索引的枚举器值 - 2

    假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum

  9. ruby - 如何将新的 rvm 安装与现有的 ruby​​ 版本相关联? - 2

    我遇到了RVM的问题,所以我卸载并重新安装了它。事实是我实际上尝试过rbenv,但这对我来说没有用,所以我试图让rvm重新启动并运行-而不必安装重复版本的Ruby。我至少安装了1个现有版本的Ruby:ruby--versionruby1.8.7(2011-12-28patchlevel357)[universal-darwin11.0]但是当我执行rvmlist时,我得到一个空白列表:bash-3.2$rvmlistrvmrubies#Defaultrubynotset.Try'rvmaliascreatedefault'.#=>-current#=*-current&&default

  10. ruby-on-rails - Ruby on Rails,使用同名枚举的问题 - 2

    以下是我认为的一些下拉列表:'form-control')%>和'form-control')%>这是我的application_helper.rbdefget_advance_bookingret=[{:require_booking=>'No'},{:require_booking=>'Yes'}]enddefget_instant_bookingret=[{:instant_booking=>'No'},{:instant_booking=>'Yes'}]end但现在的问题是,在我的模型product.rb中,我无法设置具有相同名称的枚举:classProduct我收到的错误是您

随机推荐