在 Objective-c 项目中编码 Swift 对象
Encode Swift object in Objective-c project
我有一个 swift class 集成在我的 objective-c 项目中,它 returns 我可以访问和使用的对象。我已经尝试(在 obj-c 文件中)用这个对象创建一个 属性 并使用标准方法 encode/decode 它
- (void)encodeWithCoder:(NSCoder *)encoder
和
- (id)initWithCoder:(NSCoder *)decoder
但是我的应用程序崩溃 "unrecognized selector sent to instance XXX"。
我想我不能用这种直接的方式序列化swift个对象,我现在不知道如何解决。感谢您的帮助
为了使它起作用,您必须:
a) 在你的 Swift class
中编写一组 encodeWithCoder 方法
-或-
b) 从 Obj-C class 继承
(b) 让我感到困惑,直到简单的事实变得清晰起来:Swift 对象确实 不是 NSObject 的后代,所以很多你期望的机制只是在那里,这包括整个 coder
系统。当您更改时,可以使用相当多的功能:
class myClass {
至
class myClass: NSObject {
这是一个简单的classswift。你可以以此为例。希望我们能对您有所帮助。
class UserBean:NSObject,NSCoding {
var idUser:NSNumber?
var username:String?
var password:String?
var email:String?
var token:String?
var fonte:String?
var idFacebook:String?
var uuid:String?
var profilo = UserProfileBean()
override init() {
super.init()
self.profilo = UserProfileBean()
}
required init?(coder aDecoder: NSCoder) {
idUser = aDecoder.decodeObjectForKey("idUser") as? NSNumber
username = aDecoder.decodeObjectForKey("username") as? String
password = aDecoder.decodeObjectForKey("password") as? String
email = aDecoder.decodeObjectForKey("email") as? String
token = aDecoder.decodeObjectForKey("token") as? String
fonte = aDecoder.decodeObjectForKey("fonte") as? String
idFacebook = aDecoder.decodeObjectForKey("idFacebook") as? String
uuid = (aDecoder.decodeObjectForKey("uuid") as? String)!
profilo = (aDecoder.decodeObjectForKey("profilo") as? UserProfileBean)!
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(idUser, forKey: "idUser")
aCoder.encodeObject(username, forKey: "username")
aCoder.encodeObject(password, forKey: "password")
aCoder.encodeObject(email, forKey: "email")
aCoder.encodeObject(token, forKey: "token")
aCoder.encodeObject(fonte, forKey: "fonte")
aCoder.encodeObject(idFacebook ,forKey: "idFacebook")
aCoder.encodeObject(uuid ,forKey: "idFacebook")
aCoder.encodeObject(profilo,forKey: "profilo")
}
}
我有一个 swift class 集成在我的 objective-c 项目中,它 returns 我可以访问和使用的对象。我已经尝试(在 obj-c 文件中)用这个对象创建一个 属性 并使用标准方法 encode/decode 它
- (void)encodeWithCoder:(NSCoder *)encoder
和
- (id)initWithCoder:(NSCoder *)decoder
但是我的应用程序崩溃 "unrecognized selector sent to instance XXX"。
我想我不能用这种直接的方式序列化swift个对象,我现在不知道如何解决。感谢您的帮助
为了使它起作用,您必须:
a) 在你的 Swift class
中编写一组 encodeWithCoder 方法-或-
b) 从 Obj-C class 继承
(b) 让我感到困惑,直到简单的事实变得清晰起来:Swift 对象确实 不是 NSObject 的后代,所以很多你期望的机制只是在那里,这包括整个 coder
系统。当您更改时,可以使用相当多的功能:
class myClass {
至
class myClass: NSObject {
这是一个简单的classswift。你可以以此为例。希望我们能对您有所帮助。
class UserBean:NSObject,NSCoding {
var idUser:NSNumber?
var username:String?
var password:String?
var email:String?
var token:String?
var fonte:String?
var idFacebook:String?
var uuid:String?
var profilo = UserProfileBean()
override init() {
super.init()
self.profilo = UserProfileBean()
}
required init?(coder aDecoder: NSCoder) {
idUser = aDecoder.decodeObjectForKey("idUser") as? NSNumber
username = aDecoder.decodeObjectForKey("username") as? String
password = aDecoder.decodeObjectForKey("password") as? String
email = aDecoder.decodeObjectForKey("email") as? String
token = aDecoder.decodeObjectForKey("token") as? String
fonte = aDecoder.decodeObjectForKey("fonte") as? String
idFacebook = aDecoder.decodeObjectForKey("idFacebook") as? String
uuid = (aDecoder.decodeObjectForKey("uuid") as? String)!
profilo = (aDecoder.decodeObjectForKey("profilo") as? UserProfileBean)!
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(idUser, forKey: "idUser")
aCoder.encodeObject(username, forKey: "username")
aCoder.encodeObject(password, forKey: "password")
aCoder.encodeObject(email, forKey: "email")
aCoder.encodeObject(token, forKey: "token")
aCoder.encodeObject(fonte, forKey: "fonte")
aCoder.encodeObject(idFacebook ,forKey: "idFacebook")
aCoder.encodeObject(uuid ,forKey: "idFacebook")
aCoder.encodeObject(profilo,forKey: "profilo")
}
}