代码之家  ›  专栏  ›  技术社区  ›  letsCode

将模型附加到数组中,只在swift中打印最后添加的项

  •  0
  • letsCode  · 技术社区  · 6 年前

    我不知道我在这里错过了什么,但它“看起来”对我来说是正确的。

    我在视图控制器顶部有以下两个变量:

    var itemSpecifics: ItemSpecifics!
    var itemSpecificsArray = [ItemSpecifics]()
    

    我调用一个API,并在它成功时执行以下操作:

    self.itemSpecifics = ItemSpecifics()
    self.itemSpecificsArray.removeAll()
    

    这里是我获取信息并将其添加到项目细节中的区域。

    if let getItemSpecifics = item["ItemSpecifics"] as? NSDictionary {
        if let getNameValueList = getItemSpecifics["NameValueList"] as? NSArray {
            print("game value list count \(getNameValueList.count)")
            for i in 0..<getNameValueList.count {
                if let getName = getNameValueList[i] as? NSDictionary {
                    if let itemName = getName["Name"] as? String {
                        print(itemName)
                        self.itemSpecifics._itemSpecificName = itemName
                    }
                    if let getValue = getName["Value"] as? NSArray {
                        let itemValue = getValue[0] as? String
                        self.itemSpecifics._itemSpecificValue = itemValue!
                        print("-- \(itemValue!)")
                    }
                }
                //End The Condition Information
                self.itemSpecificsArray.append(self.itemSpecifics)
            }
        }
    }
    

    所以,它是正确打印的。

    Professionally Graded
    -- Not Graded
    Sport
    -- Baseball-MLB
    Product
    -- Lot
    Player
    -- Derek Jeter
    Team
    -- New York Yankees
    Card Manufacturer
    -- Topps
    League
    -- Major Leagues
    Era
    -- Modern (1981-Now)
    Original/Reprint
    -- Original
    

    但是,当我这样做时:

    for i in 0..<self.itemSpecificsArray.count {
        print(self.itemSpecificsArray[i].itemSpecificName)
        print("** \(self.itemSpecificsArray[i].itemSpecificValue)")
    }
    

    它打印以下内容:

    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    Original/Reprint
    ** Original
    

    这是我的课程,详细的项目。

    class ItemSpecifics {
        var _itemSpecificName: String!
        var _itemSpecificValue: String!
    
        var itemSpecificName : String {
            if _itemSpecificName == nil {
                _itemSpecificName = ""
            }
            return _itemSpecificName
        }
    
        var itemSpecificValue : String {
            if _itemSpecificValue == nil {
                _itemSpecificValue = ""
            }
            return _itemSpecificValue
        }
    
    }
    

    我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Paulw11    6 年前

    您只有一个 ItemSpecifics -您将不断更新该实例的属性并将其添加到数组中,因此最终,您的数组将保存对该实例的多个引用,并且该实例具有您分配的最后一个值。

    您可以使您的代码更加“迅速”-使用 struct 而不是一个类,它提供了不变性;您通常不应该使用那种形式的“私有属性”;您可以将属性设置为只读,但使用结构,您不需要任何方式。

    另外,不要使用 NS... 基金会在SWIFT课程,除非是不可避免的。

    struct ItemSpecifics {
        let name: String
        let value: String
    }
    
    
    if let getItemSpecifics = item["ItemSpecifics"] as? [String:Any],
       let getNameValueList = getItemSpecifics["NameValueList"] as? [[String:Any]] {
    
       for nameValueList in getNameValueList {
            if let name = nameValueList["Name"] as? String,
               let value = nameValueList["Value"] as? String {
                    let newItem = ItemSpecifics(name: name, value: value)
                    self.itemSpecificsArray.append(newItem)
            }
       }
    }