Swift 将任何对象强制转换为特定类
我正在使用socket.io Swift库。使用以下代码行Swift 将任何对象强制转换为特定类,swift,casting,socket.io,anyobject,Swift,Casting,Socket.io,Anyobject,我正在使用socket.io Swift库。使用以下代码行 socket.on("info") { (dataArray, socketAck) -> Void in let user = dataArray[0] as? User print(user._id) } dataArray[0]是一个有效的对象,但是user在强制转换后显示为nil 由于dataArray[0]作为AnyObject返回, 如何将AnyObject转换为Use
socket.on("info") { (dataArray, socketAck) -> Void in
let user = dataArray[0] as? User
print(user._id)
}
dataArray[0]
是一个有效的对象,但是user
在强制转换后显示为nil
由于dataArray[0]
作为AnyObject
返回,
如何将AnyObject
转换为User
Object?。或者用不同的方法做我想做的事
您需要创建一个接受任何对象并读取其中数据的构造函数。 我猜在本例中,
dataArray[0]
是一个JSON对象
class User {
init(data: [String: AnyObject]) {
username = data["username"] as? String ?? ""
}
}
自从这条线之后
let user = dataArray[0] as? User
您在user
中有一个nil
值,这意味着您在dataArray
的第一个位置没有user
值
由于dataArray
来自服务器(我猜是这样),它可能包含User
的序列化版本
现在我们真的需要知道dataArray[0]到底是什么。然而
如果dataArray[0]包含NSData
在这种情况下,试试这个
let json = JSON(dataArray[0] as! NSData)
let user = User(json:json)
我就是这样管理我的:
// Structure used as parameter
struct InfoStruct {
var nome: String = ""
var sobrenome:String = ""
var nascimentoTimestamp: NSNumber = 0
init() {
}
// Struct to AnyObject
func toAnyObject() -> Any {
var dic = [String:AnyObject?]()
if (nome != "") { dic["nome"] = nome as AnyObject }
if (sobrenome != "") { dic["sobrenome"] = sobrenome as AnyObject }
if (nascimentoTimestamp != 0) { dic["nascimentoTimestamp"] = nascimentoTimestamp as AnyObject }
return dic
}
// AnyObject to Struct
func fromAnyObject(dic:[String:AnyObject]) -> InfoStruct {
var retorno = InfoStruct()
if (dic["nome"] != nil) { retorno.nome = dic["nome"] as? String ?? "" }
if (dic["sobrenome"] != nil) { retorno.sobrenome = dic["sobrenome"] as? String ?? "" }
if (dic["nascimentoTimestamp"] != nil) { retorno.nascimentoTimestamp = dic["nascimentoTimestamp"] as? NSNumber ?? 0 }
return retorno
} }
// User class
class Usuario: NSObject {
var key: String
var admin: Bool
var info: InfoStruct // Struct parameter
init(_ key: String?) {
self.key = key ?? ""
admin = false
info = InfoStruct() // Initializing struct
}
// From Class to AnyObject
func toAnyObject() -> Any {
var dic = [String:AnyObject?]()
if (key != "") { dic["key"] = key as AnyObject }
if (admin != false) { dic["admin"] = admin as AnyObject }
dic["info"] = info.toAnyObject() as AnyObject // Struct
return dic
}
// From AnyObject to Class
func fromAnyObject(dic:[String:AnyObject]) -> Usuario {
let retorno = Usuario(dic["key"] as? String)
if (dic["key"] != nil) { retorno.key = dic["key"] as? String ?? "" }
if (dic["admin"] != nil) { retorno.admin = dic["admin"] as? Bool ?? false }
if (dic["info"] != nil) { retorno.info = InfoStruct.init().fromAnyObject(dic: dic["info"] as! [String : AnyObject]) } // Struct
return retorno
} }
// Using
let dao = FirebaseDAO.init(_type: FirebaseDAOType.firebaseDAOTypeUser)
dao.loadValue(key: uid) { (error, values:[String : AnyObject]) in
if error == nil {
let user = Usuario(values["key"] as? String).fromAnyObject(dic: values)
}
}
我希望有帮助 如果强制转换失败,使用
as?
的可选向下转换将返回nil
。什么是数据数组[0]。dynamicType?你确定这是一个用户
?嘿@JAL,dataArray是[AnyObject],dataArray[0]是我在调试器中看到的任何对象,但这行print(dataArray[0].dynamicType)打印出“\uu NSDictionaryM”我很困惑看起来像dataArray
实际上是一个字典数组,而不是你想象的用户
对象。尝试将dataArray[0]
转换为[String:AnyObject]
并打印键和值。让test=dataArray[0]转换为[String:AnyObject];当我打印(test.values)时,打印出“LazyMapCollection(_base:”,我真的不理解@jalYou确定这段代码可以编译吗?因为user
应该是可选的,并且您访问它的\u id
属性时没有可选的链接或展开。我已经有一个用于json的属性。类似这样:init?(json:json){self.\u id=“\u id”您好,让json=json(dataArray[0])行给我这个错误:参数标签(\u:)与任何可用的重载都不匹配。@SerhanOztekin:请尝试让json=json(dataArray[0]作为!NSData)
@SerhanOztekin:好的,因此数组的第一个元素不是NSData
。请运行此命令,并让我知道您在日志打印(列表[0]。dynamicType]中看到了什么。