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

如何使用NSCoder快速编码枚举?

孟胤
2023-03-14
问题内容

背景

我正在尝试使用NSCoding协议对String样式的枚举进行编码,但是我遇到了转换为String和从String返回的错误。

解码和编码时出现以下错误:

字符串不可转换为舞台

额外参数ForKey:通话中

    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

迅速1.0(6.0的Xcode)使用toRaw()fromRaw()这样的:

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

    aCoder.encodeObject( self.stage.toRaw(), forKey:"stage" )


 类似资料:
  • 问题内容: 我需要定义一个可以在使用某些Objective-c类型的类中调用的协议 但是这样做不起作用: 你明白他的错误 如果我没有在协议上放置@objc标记,则它将在采用该协议并从Objective- C类型类(如UIViewController)继承的类中被调用时立即使应用程序崩溃。 所以我的问题是,我应该如何使用@objc标签声明并传递我的枚举? 问题答案: Swift枚举与Obj-C(或C

  • 问题内容: 是否可以使用存储元组?我有一个类似的元组。但是不起作用。我必须将元组转换为还是绝对不可能?谢谢你的帮助 问题答案: 无法对元组进行编码,因为它不是类,但是一种方法是分别对元组的每个组成部分进行编码,然后在解码时对每个组成部分进行解码,然后将元组的值设置为根据解码内容构造的元组。

  • 问题内容: 我正在使用wahoo Fitness API,它定义了以下Objective-C枚举: 我找不到快速使用它的方法。我首先尝试对其进行切换/操作,但未成功。我正要继续进行以下操作: 但是它不能编译: 任何解决方法?我阅读使用,但在xcode beta-4中不起作用。 问题答案: 如您所说,从.beta 4开始,使用.value获取基础整数的解决方法不再起作用。 不幸的是an 不能从Obj

  • 问题内容: 我有一个必须符合且包含值数组的对象。我怎么能用/对其进行编码/解码?额外的问题:如何编码最紧凑?(它必须进入保存的Game Center状态数据,其大小是有限的。) 理想情况下,我只想写一个等于数组大小的an ,然后写乘a的64位乘以类似的方式读取它。我可以这样做吗? 不起作用。 问题答案: 这是将数组编码为字节数组的可能解决方案。它的灵感来自于如何使用NSCoding序列化C数组?。

  • 问题内容: 这是我的代码,但显示了进度。这段代码有什么错误吗?请提供一些想法来解决此问题,或者提供一些与此相关的链接。 问题答案: 更新的答案: 要关闭ProgressHUD: