相关疑难解决方法(0)

使用NSCoding将自定义Swift类保存到UserDefaults

我目前正在尝试将自定义Swift类保存到NSUserDefaults.这是我的Playground的代码:

import Foundation

class Blog : NSObject, NSCoding {

    var blogName: String?

    override init() {}

    required init(coder aDecoder: NSCoder) {
        if let blogName = aDecoder.decodeObjectForKey("blogName") as? String {
            self.blogName = blogName
        }
    }

    func encodeWithCoder(aCoder: NSCoder) {
        if let blogName = self.blogName {
            aCoder.encodeObject(blogName, forKey: "blogName")
        }
    }

}

var blog = Blog()
blog.blogName = "My Blog"

let ud = NSUserDefaults.standardUserDefaults()    
ud.setObject(blog, forKey: "blog")
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我收到以下错误

执行被中断,原因:信号SIGABRT.

在最后一行(ud.setObject...)

在带有消息的应用程序中,相同的代码也会崩溃

"属性列表格式无效:200(属性列表不能包含'CFType'类型的对象)"

有人可以帮忙吗?我在Maverick上使用Xcode 6.0.1.谢谢.

nsuserdefaults nscoding sigabrt swift

76
推荐指数
6
解决办法
5万
查看次数

NSKeyedArchiver在Swift 3(XCode 8)中不起作用

我已将我的项目迁移到Swift 3并且NSKeyedArchiver无法正常工作.我在尝试解码这样的对象时实际上有一个运行时错误:

let startDayTime = aDecoder.decodeObject(forKey: Key.startDayTime) as! Int
Run Code Online (Sandbox Code Playgroud)

它在Xcode 7.3中的Swift 2.2中完美运行.还有其他人遇到过这样的麻烦吗?

PS我在模拟器和设备上都有这个错误.

更新:我通过使用decodeInteger(forKey key: String)而不是来解决这个问题decodeObject(forKey key: String).由于某种原因,AnyObject不会在Swift 3中转换为Integer,尽管它在Swift 2.2中也是如此

swift3 ios10 xcode8

16
推荐指数
2
解决办法
5580
查看次数

如何使用NSUserDefaults在Swift中存储自定义类的数组?

我有一个名为的自定义类Person,它在输入信息时存储有关某人的各种属性.

class Person {

    // Person dictionary variable
    var name: String?
    var age: String?
    var html_url: String?

    init(json: NSDictionary) { // Dictionary object
        self.name = json["name"] as? String
        self.age = json["age"] as? String
        self.html_url = json["html_url"] as? String // Location of the JSON file
    }
}
Run Code Online (Sandbox Code Playgroud)

创建字典后,将其放入数组中.NSUserDefaults当点击按钮时,我在将阵列保存时遇到问题.

personArray.append(newPerson) // newPerson = dictionary of attributes


NSUserDefaults.standardUserDefaults().setObject(personArray, forKey: "personArray")
        NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)

我已经看过如何在NSUserDefaults中存储自定义对象使用NSCoding将自定义SWIFT类保存到UserDefaults但是我没有运气并且发现它很难理解.

当我只是尝试保存到NSUserDefaults时,我被告知以下内容:

Attempt to set a non-property-list object (
    "PersonApp.Person"
) as an NSUserDefaults/CFPreferences …
Run Code Online (Sandbox Code Playgroud)

nsuserdefaults ios swift swift2

8
推荐指数
2
解决办法
9823
查看次数

Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器

我的自定义对象符合NSCoding协议,具有以下方法

required init(coder decoder: NSCoder) {
    super.init()

    createdDate = decoder.decodeObject(forKey: "created_date") as? Date
    userId = decoder.decodeInteger(forKey: "user_id")
}

func encode(with aCoder: NSCoder) {
    aCoder.encode(createdDate, forKey: "created_date")
    aCoder.encode(userId, forKey: "user_id")
}
Run Code Online (Sandbox Code Playgroud)

这是Swift 3中nscoding协议的正确方法名称,但应用程序因错误而崩溃 SwiftValue encodeWithCoder - unrecognized selector sent to instance

显然这种方法不可用,为什么不被认可?

参考https://developer.apple.com/reference/foundation/nscoding

这是我制作的归档方法

func encodeObject(_ defaults:UserDefaults, object:NSCoding?, key:String) {
    if (object != nil) {
        let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object)
        defaults.set(encodedObject, forKey: key)
    } else {
        defaults.removeObject(forKey: key)
    }
}
Run Code Online (Sandbox Code Playgroud)

nscoding swift3 xcode8

5
推荐指数
1
解决办法
7089
查看次数

标签 统计

nscoding ×2

nsuserdefaults ×2

swift ×2

swift3 ×2

xcode8 ×2

ios ×1

ios10 ×1

sigabrt ×1

swift2 ×1