【问题标题】:How to store an array that is within an another array to a global variable that has been passed from JSON in Swift?如何将另一个数组中的数组存储到 Swift 中从 JSON 传递的全局变量中?
【发布时间】:2016-11-11 09:36:20
【问题描述】:

我有一个从 API 调用接收数组的 JSON

在该数组中还有 3 个其他数组:

userDetailsuserStatscommunities

此 API 调用的一个示例是:

["communities": <__NSArrayI 0x6000002540a0>(
{
id = 5;
name = South;
},
{
id = 13;
name = HurraHarry;
},
{
id = 15;
name = EnclliffeT;
}
)
, "userStats": {
totalDraws = 3;
totalLosses = 10;
totalWins = 1;
}, "userDetails": {
id = 31;
"user_email" = "steve@gmail.com";
"user_name" = "Steve Base";
}]

我想将数组 userStats 存储在一个可以传递给另一个 VC 的变量中。

我的班级中有一个全局变量var userStatsArray = [AnyObject]()

以下代码处理 JSON:

 let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
                  print (json!)

                  if let arr = json?["communities"] as? [[String:String]] {
                        self.communitiesArray = arr.flatMap { $0["name"]!}
                        self.communityIdsArray = arr.flatMap { $0["id"]!}

                    }

                    if let dict = json?["userDetails"] as? [String:String] {
                      self.tempPlayerId = [dict["id"]!]
                        let characterArray = self.tempPlayerId.flatMap { String.CharacterView($0) }
                        let newPlayerId = String(characterArray)
                        self.playerId = newPlayerId
                    }
                    if  let tempArray = json?["userStats"] as? [String:AnyObject]{
                        print ("here ", tempArray)

                    }

打印命令成功打印userStats 数组及其所有标题(totalWins、totalDraws、totalLosses...) -

如何将此数组存储到我的全局变量 var userStatsArray = [AnyObject]() 中,以便将其传递给另一个 VC?

【问题讨论】:

    标签: ios arrays json swift


    【解决方案1】:

    最好创建一个这样的自定义类,并使用该自定义类类型声明数组。然后你将你的 userStats 对象转换为你的自定义类类型。

    class userStats: NSObject {
    
    var totalDraws: NSNumber?
    var totalLosses: NSNumber?
    var totalWins: NSNumber?
    
        init(totalDraws: NSNumber?, totalLosses: NSNumber?, totalWins: NSNumber?) {
            self.totalDraws = totalDraws
            self.totalWins = totalWins
            self.totalLosses = totalLosses
        }
    
    }
    
    var userStatsArray = [userStats]()
    

    // 像这样改变你的代码

    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
                  print (json!)
    
                  if let arr = json?["communities"] as? [[String:String]] {
                        self.communitiesArray = arr.flatMap { $0["name"]!}
                        self.communityIdsArray = arr.flatMap { $0["id"]!}
    
                    }
    
                    if let dict = json?["userDetails"] as? [String:String] {
                      self.tempPlayerId = [dict["id"]!]
                        let characterArray = self.tempPlayerId.flatMap { String.CharacterView($0) }
                        let newPlayerId = String(characterArray)
                        self.playerId = newPlayerId
                    }
                    if  let tempArray = json?["userStats"]as? userStats {
    
                        userSytatsArray.append(tempArray)
                    }
    

    【讨论】:

    • 那么数组userStatsArray 是否可以通过segue 传递,内容将按照userStats 类中的定义进行设置?
    • 您可以通过在目标视图控制器中声明相同类型的数组,将 userStatsArray 传递到您想要的任何位置。
    • 为什么在自定义类中声明可选属性而只声明非可选初始化器?考虑在一个类中必须使用声明的初始化器。
    • @vadian 初始值设定项更改为可选 :)
    • @RDowns,请使用类初始值设定项作为可选项,请参阅 userStats 类中更新的初始值设定项方法。
    【解决方案2】:

    看看ObjectMapper!使用这个强大的框架,您可以创建 API 返回的数据的可映射模型,并让它为您执行整个工作:)

    像这样声明你的模型类:

    class UserInfo: Mappable {
    var communities : [Community]?
    var stats: UserStats?
    var details: UserDetails?
    
    required init?(map: Map) {
    }
    
    func mapping(map: Map) {
        communities <- map["communities"]
        stats <- map["userStats"]
        details <- map["userDetails"]
     }
    }
    
    class Community: Mappable {
    var id: Int!
    var name: String!
    
    required init?(map: Map) {
    }
    
    func mapping(map: Map) {
        id <- map["id"]
        name <- map["name"]
     }
    }
    
    class UserStats: Mappable {
    var totalDraws : Int!
    var totalLosses : Int!
    var totalWins : Int!
    
    required init?(map: Map) {
    }
    
    func mapping(map: Map) {
        totalDraws <- map["totalDraws"]
        totalLosses <- map["totalLosses"]
        totalWins <- map["totalWins"]
     }
    }
    
    class UserDetails: Mappable {
    var id : Int!
    var email : String!
    var username : String!
    
    required init?(map: Map) {
    }
    
    func mapping(map: Map) {
        id <- map["id"]
        email <- map["user_email"]
        username <- map["user_name"]
     }
    }
    

    后来只是:

    let user = UserInfo(JSONString: JSONString)
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多