背景
我正在尝试使用NSCoding协议对String样式的枚举进行编码,但是我遇到了从String转换回来的错误.
解码和编码时出现以下错误:
字符串不可转换为Stage
额外参数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( …Run Code Online (Sandbox Code Playgroud) 创建Today小部件,我UserDefaults(suiteName:)用来保存一些数据.在我正在使用的主要应用程序中UserDefaults.standard().这是扩展无法读取(或可以吗?),这就是我使用suiteName:构造函数的原因.
用户UserDefaults.standard()在主应用中持久保存的数据需要在扩展中可用.
在这个时候,我坚持两者,以便可以共享价值观
UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...
Run Code Online (Sandbox Code Playgroud)
问题是我应该UserDefaults.standard()放在一起,只是UserDefaults(suiteName:)在我的应用程序中使用,或者这是不好的做法,如果是这样,为什么?
编辑:我正在使用App组容器.为了澄清我要问我应该在我的项目中用suiteName替换standard()吗?
我有一个结构包含一个结构NSObject,我想序列化到一个NSData对象:
struct Packet {
var name: String
var index: Int
var numberOfPackets: Int
var data: NSData
}
var thePacket = Packet(name: name, index: i, numberOfPackets: numberOfPackets, data: packetData)
Run Code Online (Sandbox Code Playgroud)
我如何最好地将数据包序列化为一个NSData,以及如何最好地将其反序列化?
运用
var bufferData = NSData(bytes: & thePacket, length: sizeof(Packet))
Run Code Online (Sandbox Code Playgroud)
只给了我名字和数据的指针.我正在探索NSKeyedArchiver,但后来我必须使Packet成为一个对象,我宁愿保持它的结构.
干杯
聂
我有
var priority : Priority! = Priority.defaultPriority
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(priority.toRaw(), forKey: "priority") //toRaw may not yield the result I am expecting
}
required init(coder aDecoder: NSCoder) {
priority = aDecoder.decodeIntegerForKey("priority") //complaining about conflicting types
}
Run Code Online (Sandbox Code Playgroud)
枚举如下:
enum Priority : Int {
case defaultPriority = 0
case lowPriority = 1
case mediumPriority = 2
case highPriority = 3
}
Run Code Online (Sandbox Code Playgroud)
编码/解码这个的最佳方法是什么?
我有一个名为'新闻'的自定义结构,我想将其附加到NSUserDefault的数组中.但它显示错误"类型'新闻'不符合协议'AnyObject'".
我不想将'News'结构更改为类,因为它已经被用于其他代码.无论如何我可以将NSUserDefaults.standardUserDefaults().arrayForKey("savedNewsArray")类型更改为[新闻]?
var savedNews = NSUserDefaults.standardUserDefaults().arrayForKey("savedNewsArray")
var addSavedNews = savedNews as? [News]
addSavedNews.append(News(id: "00", title: newsTitle, source: source, imageURL: imageURL, url: url))
NSUserDefaults.standardUserDefaults().setObject(addSavedNews, forKey: "savedNewsArray")
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)
这是'新闻'结构.
public struct News {
public var id: String
public var title: String
public var source: String?
public var imageURL: String?
public var date: NSDate?
public var url: String
init(id: String, title: String, source: String, imageURL: String, url: String) {
self.id = id
self.title = title
self.source = source
self.imageURL = imageURL
self.url = …Run Code Online (Sandbox Code Playgroud) 我正在尝试对结构进行编码
struct Configuration : Encodable, Decodable {
private enum CodingKeys : String, CodingKey {
case title = "title"
case contents = "contents"
}
var title : String?
var contents: [[Int]]?
}
Run Code Online (Sandbox Code Playgroud)
转换成 JSON 以存储在 UserDefaults.standard 的本地键中。我有以下代码:
let jsonString = Configuration(title: nameField.text, contents: newContents)
let info = ["row" as String: jsonString as Configuration]
print("jsonString = \(jsonString)")
//trying to save object
let defaults = UserDefaults.standard
let recode = try! JSONEncoder().encode(jsonString)
defaults.set(recode, forKey: "simulationConfiguration")
//end of saving local
Run Code Online (Sandbox Code Playgroud)
打印返回:
jsonString = Configuration(title: Optional("config"), …Run Code Online (Sandbox Code Playgroud)