如何使用 NSCoder 在 swift 中对枚举进行编码?

2023-11-24

背景

我正在尝试使用 NSCoding 协议对字符串样式枚举进行编码,但在与字符串之间转换和返回时遇到错误。

我在解码和编码时遇到以下错误:

字符串无法转换为 Stage

额外参数 ForKey:在调用中

Code

    enum Stage : String
    {
        case DisplayAll    = "Display All"
        case HideQuarter   = "Hide Quarter"
        case HideHalf      = "Hide Half"
        case HideTwoThirds = "Hide Two Thirds"
        case HideAll       = "Hide All"
    }

    class AppState : NSCoding, NSObject
    {
        var idx   = 0
        var stage = Stage.DisplayAll

        override init() {}

        required init(coder aDecoder: NSCoder) {
            self.idx   = aDecoder.decodeIntegerForKey( "idx"   )
            self.stage = aDecoder.decodeObjectForKey(  "stage" ) as String    // ERROR
        }

        func encodeWithCoder(aCoder: NSCoder) {
            aCoder.encodeInteger( self.idx,             forKey:"idx"   )
            aCoder.encodeObject(  self.stage as String, forKey:"stage" )  // ERROR
        }

    // ...

    }

您需要将枚举与原始值相互转换。在 Swift 1.2 (Xcode 6.3) 中,这看起来像这样:

class AppState : NSObject, NSCoding
{
    var idx   = 0
    var stage = Stage.DisplayAll

    override init() {}

    required init(coder aDecoder: NSCoder) {
        self.idx   = aDecoder.decodeIntegerForKey( "idx" )
        self.stage = Stage(rawValue: (aDecoder.decodeObjectForKey( "stage" ) as! String)) ?? .DisplayAll
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeInteger( self.idx, forKey:"idx" )
        aCoder.encodeObject(  self.stage.rawValue, forKey:"stage" )
    }

    // ...

}

Swift 1.1(Xcode 6.1),使用as代替as!:

    self.stage = Stage(rawValue: (aDecoder.decodeObjectForKey( "stage" ) as String)) ?? .DisplayAll

Swift 1.0(Xcode 6.0)使用toRaw() and fromRaw()像这样:

    self.stage = Stage.fromRaw(aDecoder.decodeObjectForKey( "stage" ) as String) ?? .DisplayAll

    aCoder.encodeObject( self.stage.toRaw(), forKey:"stage" )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 NSCoder 在 swift 中对枚举进行编码? 的相关文章

随机推荐

  • Shiro JndiLdapRealm 针对 LDAP 的授权

    The Shiro 类 JndiLdapRealm 的 JavaDoc明确表示默认情况下禁用授权 并且用户应通过子类化和覆盖 LDAP 服务器来实现授权JndiLdapRealm doGetAuthorizationInfo方法 是否有示例
  • R中使用strptime()从字符串中提取时间,返回NA

    我试图从 R 中的字符串中提取时间 结果无法停止得到 NA 我尝试了正则表达式标签的多种变体 但似乎无法解决这个简单的问题 任何帮助 澄清表示赞赏 这是我的示例代码 gt x 1 2 7 2013 7 43 gt class x 1 cha
  • 如何使用 Delphi 7 在状态/任务栏按钮中显示进度?

    如果您在 Windows 7 下复制文件 您将看到progress副本的某种形式状态栏或任务栏按钮开始显示进度条的应用程序 使用 Delphi 7 可以实现这一点吗 我有一些冗长的操作 非常适合以这种方式展示它的进展 使用 Total Co
  • PHP 中的网页抓取

    我正在寻找一种方法 可以从用户提供的 URL 中对另一个页面进行小型预览PHP 我只想检索页面的标题 图像 如网站的徽标 和一些文本或描述 如果可用 有没有简单的方法可以在没有任何外部库 类的情况下做到这一点 谢谢 到目前为止 我已经尝试使
  • 保存和加载数据 Visual Basic 的简单方法

    我想知道在 vb 中通过不同形式保存和加载数据的最简单方法是什么 我只想保存用户保存的 3 个 textbox text 并能够将其加载到不同的表单上 如果是用户设置 您可以使用内置的我的设置要保存和加载的对象 来自上面的链接 My Set
  • 检测对背景大小的支持:封面

    什么是检测CSS3支持的保存方法背景尺寸 封面 特别是在 IE 以下测试在 IE 背景大小 to cover div style backgroundSize cover 我在测试时得到的唯一真实结果 if backgroundSize i
  • 是否可以使用椭圆曲线加密技术来加密数据?

    到目前为止我只看到它在数字签名和密钥协商协议中使用 它可以像 RSA 一样用来实际加密数据吗 有这方面的库吗 Edited 我需要类似 RSA 的东西 使用接收者的公钥对数据进行加密 以便稍后他可以使用他的私钥对其进行解密 我知道 ECDH
  • ImageButton:强制方形图标(高度 = WRAP_CONTENT,宽度 = ?)

    在我的水平 LinearLayout 中 我有一个 TextEdit 和一个 ImageButton ImageButton 与 TextEdit 一样高 我希望 ImageButton 的宽度和长度完全相同 目前看来 ImageButto
  • Android proguard 混淆的代码在实际上不应该导致 NullPointerException 的情况下导致了 NullPointerException

    我已经在 Android Marketplace 上分发了一个应用程序 我从一小部分用户 可能是 2 那里收到了错误报告 他们在没有逻辑意义的情况下得到了 NullPointerExceptions 我自己从来无法复制这一点 该代码相对简单
  • 即使事件重新触发后,Flutter BlocListener 也仅执行一次

    我正在实施Reso Coder 干净的架构扑腾中 我按照他的指南将项目分层并使用依赖项注入 在其中一种情况下 我希望出现以下场景 管理员用户登录 在主屏幕上查看数据 对其进行编辑 然后按按钮将数据保存到本地数据库 sqflite 保存数据后
  • 不存在的服务“request_stack”

    我正在编写 Symfony 2 6 应用程序 并且在尝试将 RequestStack 注入服务时遇到了问题 我想要的是能够从我的服务中获取当前请求 但出现以下异常 ServiceNotFoundException The service h
  • 为什么 LISP 中不需要#'(尖引号)符号?

    我正在从 Practical Common Lisp 一书中学习 Lisp 在某一时刻 我应该输入以下代码 1 remove if not evenp 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 我想这里的想法当然是 r
  • 如何在所有子图上方设置一个主标题

    我在用pyplot 我有4个子图 如何在所有子图之上设置一个主标题 title 将其设置在最后一个子图之上 Use pyplot suptitle or Figure suptitle import matplotlib pyplot as
  • Pandas-如果值大于0,则将一列除以另一列?

    我有一个 pandas 数据框 其中包含日期 项目和 2 个值 我想要做的就是输出另一列 如果 B 列大于 0 则输出 A 列 B 列的乘积 如果 B 列等于 0 则输出 0 date item A B C 1 1 2017 a 0 3 0
  • 创建没有 persistence.xml 配置文件的 JPA EntityManager

    有没有办法初始化EntityManager没有定义持久性单元 您能否提供创建实体管理器所需的所有属性 我需要创建EntityManager来自用户在运行时指定的值 更新中persistence xml并且重新编译不是一个选择 任何关于如何做
  • THREE.JS:在网格内部查看几何图形

    当输入几何体 例如球体网格 时 它的行为就像几何体不存在一样 颜色和纹理从外面可见 但是一旦我放大网格 这些属性就消失了 如何使球体网格的颜色和纹理在网格内部可见 mesh material side THREE DoubleSide Or
  • 会话 Bean 的会话状态

    我正在读一本关于 Java EE 6 的书 我遇到了以下部分 无状态 会话 bean 不包含方法之间的对话状态 并且任何 实例可用于任何客户端 有状态 会话bean包含会话状态 必须保留该状态 单个用户的跨方法 对话状态 是什么意思 有人用
  • Linq 中的分层数据 - 选项和性能

    我有一些分层数据 每个条目都有一个 id 和一个 可为空 父条目 id 我想检索树中给定条目下的所有条目 这是在 SQL Server 2005 数据库中 我正在 C 3 5 中使用 LINQ to SQL 查询它 LINQ to SQL
  • 突出显示所有字段的匹配结果

    我希望突出显示匹配的结果 如果我提到字段名称并且它返回突出显示的文本 这对我有用 但是如果我将该字段指定为 all 它不会返回任何值 这对我有用 curl XGET http localhost 9200 my index my type
  • 如何使用 NSCoder 在 swift 中对枚举进行编码?

    背景 我正在尝试使用 NSCoding 协议对字符串样式枚举进行编码 但在与字符串之间转换和返回时遇到错误 我在解码和编码时遇到以下错误 字符串无法转换为 Stage 额外参数 ForKey 在调用中 Code enum Stage Str