【问题标题】:How to remove duplicates values and create a table view section in Swift?如何在 Swift 中删除重复值并创建表格视图部分?
【发布时间】:2015-02-11 18:50:33
【问题描述】:

感谢大家的帮助,我有一本带有字典数组的字典。 我的目标是从一个内部字典值中整理出一个从 plist 文件中读取的数组。这些值是字符串类型,并返回一个具有重复值的数组。这个返回的数组总共有 30 个值(元素),可以分为 6 个值。我需要以某种方式从这 6 个值中创建一个数组,以便可以在我的 tableView 数据源 numberOfSectionsInTableView 上使用它:

我查看了 map() 和 filter() ,但没有找到任何解决方案。我的代码是;

 // setupLoading called from viewDidLoad()
 func setupLoading() {
    let path = NSBundle.mainBundle
    let bundlePath = path.pathForResource("KempfRef", ofType: "plist")
    let dict: NSDictionary? = NSDictionary(contentsOfFile: bundlePath!)
    let plistArray: NSArray = dict!["KempfRef"] as NSArray

    for innerDict in plistArray as Array {


             let kempf: KempfFiber = KempfFiber() // Model
             kempf.name = innerDict["Name"] as String
             kempf.detail = innerDict["Detail"] as String
             kempf.imageName = innerDict["ImageName"] as String
             kempf.specGrav = innerDict["SpecGrav"] as String
             kempf.toughness = innerDict["Toughness"] as String
             kempf.pdfFile = innerDict["PDF"] as String
             //println("DESCRIPTION: \(kempf.description())")

             var theType = innerDict["Type"] as String             
             var kempfTypes = [String](arrayLiteral: theType)

             println("theType")
  }

// 这里是 theType 的 println 类型是:

BERKempf
BERKempf
BERKempf
BERKempf
CHRYBERKempf
CHRYBERKempf
CHRYBERKempf
CORUNKempf
CORUNKempf
CORUNKempf
CORUNKempf
GARNKempf
GARNKempf
GARNKempf
GARNKempf
GARNKempf
GARNKempf
GARNKempf
OTHERKempf
OTHERKempf
OTHERKempf
OTHERKempf
OTHERKempf
OTHERKempf
OTHERKempf
SPINEKempf
SPINEKempf
SPINEKempf
SPINEKempf

谢谢大家

【问题讨论】:

  • 你没有对你创建的kempf vsriable 做任何事情。您想为您的部分使用哪个字段?
  • @Paulw11,谢谢。我正在尝试利用“类型”键返回的值。然后我创建了我想用于我的部分的 var kempfTypes 数组。我知道我没有在这里展示任何东西,因为我无法从我尝试过的东西中得到任何东西。您能否就我应该做什么或可能使用的功能提出建议?
  • 我将创建另一个字典,其中包含一个字符串键(这将是您的类型)和一个 KempfFiber 数组作为值。然后当你得到一个类型时,你从字典中检索数组。如果它是 nil 则创建一个新数组,将kempf 对象添加到其中,否则只需将kempf 对象添加到现有数组中。然后,您可以将键作为您的部分的数组。

标签: ios iphone arrays swift dictionary


【解决方案1】:

我将创建另一个字典,其中包含一个字符串键(将是您的类型)和一个 KempfFiber 数组作为值。然后当你得到一个类型时,你从字典中检索数组。如果它是 nil 则创建一个新数组,将 kempf 对象添加到其中,否则只需将 kempf 对象添加到现有数组中。然后,您可以将键作为您的部分的数组。

类似这样的东西(kempfDatasectionKeys 是你当前类的属性 -

self.kempfData=[String:[KempfFiber]]    

for innerDict in plistArray as Array {
    let kempf: KempfFiber = KempfFiber() // Model
    kempf.name = innerDict["Name"] as String
    kempf.detail = innerDict["Detail"] as String
    kempf.imageName = innerDict["ImageName"] as String
    kempf.specGrav = innerDict["SpecGrav"] as String
    kempf.toughness = innerDict["Toughness"] as String
    kempf.pdfFile = innerDict["PDF"] as String

    var theType = innerDict["Type"] as String     

    var kempfArray=self.kempfData[theType]

    if (kempfArray ==nil) {
        kempfArray =[Kempf]()     
    }

    kempfArray!.append(kempf)
    self.kempfData[theType]= kempfArray

  }

  self.sectionKeys=Array(self.kempfData.keys)

现在您可以返回 sectionKeys.count 作为您的部分计数。 您的numberOfRowsInSection 将是

 let sectionData=self.kempfData[self.sectionKeys[indexPath.section]]

 if (sectionData != nil) {
     return sectionData!.count
 }
 else {
     return 0
 }

同样,在您cellForRowAtIndexPath 中,您可以使用

let sectionData=self.kempfData[self.sectionKeys[indexPath.section]]

if (sectionData != nil) {
     let kempf=sectionData[indexPath.row]
     // Configure your cell...
}
else {
    // Something bad happened
}

您可能希望在创建 self.sectionKeys 数组后对其进行排序,以便您的部分按字母顺序排列。

【讨论】:

  • 非常感谢,太棒了!这正是我所需要的。我今晚将离开我的机器,但可能会在凌晨 3:00 左右实施。我会让你知道。我如何接受这个或投票赞成答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2016-12-27
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多