1

我正在使用 socket.io Swift 库。使用以下代码行,

socket.on("info") { (dataArray, socketAck) -> Void in
            let user = dataArray[0] as? User
            print(user._id)
}

dataArray[0]是一个有效对象,但在强制转换user似乎为零

由于dataArray[0]返回为 a AnyObject,我如何AnyObject转换为UserObject?或者以某种方式设法用不同的方法做我想做的事?

套接字类

用户类

4

3 回答 3

3

因为在这条线之后

let user = dataArray[0] as? User

nil里面有一个值user意味着你User在第一个位置没有值dataArray

由于dataArray来自服务器(我猜)它可能包含一个序列化版本的User.

现在我们真的需要知道真正的 dataArray[0] 是什么。然而...

如果 dataArray[0] 包含 NSData

在这种情况下试试这个

let json = JSON(dataArray[0] as! NSData)
let user = User(json:json)
于 2016-07-14T14:30:52.077 回答
0

这就是我管理我的方式:

// 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)
     }
}

我希望它有帮助!

于 2019-04-16T02:46:18.383 回答
0

您需要创建一个接受 AnyObject 并读取其中数据的构造函数。我猜在这种情况下dataArray[0]是一个 JSON 对象。

class User {
  init(data: [String: AnyObject]) {
     username = data["username"] as? String ?? ""
  }
}
于 2016-07-14T13:48:47.240 回答