背景
我正在尝试使用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: