Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将任何对象强制转换为特定类_Swift_Casting_Socket.io_Anyobject - Fatal编程技术网

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.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
转换为
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]中看到了什么。