Swift从自定义对象数组中获取属性的第一个字母

时间:2015-07-06 05:54:17

标签: ios swift uitableview

我有一个自定义对象

class Keyword
{
    var keyword : String
    var description : String

    init(keywordID : Int, keyword : String, description : String)
    {
        self.keyword = keyword;
        self.description = description;
    }
}

它的数据就像

var keywords = [Keyword]()
keywords.append(Keyword(keyword: "abc", description: "dsd dfgdf dghj"))
keywords.append(Keyword(keyword: "adet", description: "dsd dfgdf dghj"))
keywords.append(Keyword(keyword: "niuk", description: "dsd dfgdf dghj"))
keywords.append(Keyword(keyword: "sdg", description: "dsd dfgdf dghj"))
keywords.append(Keyword(keyword: "sax", description: "dsd dfgdf dghj"))
keywords.append(Keyword(keyword: "trygh", description: "dsd dfgdf dghj"))

要在UITableView中创建部分,我需要将第一个字母作为部分标题。对于上面的例子,我需要如下数据

  1. a - > abc,adet
  2. n - > niuk
  3. s - > sdg,sax
  4. t - > trygh
  5. 我创建了另一个对象来存储上述数据

    class KeywordSection
    {
        var section : Character
        var keywords : [Keyword]
    
        init(section : Character, keywords : [Keyword])
        {
            self.section = section;
            self.keywords = keywords;
        }
    }
    

    我在Android中通过遍历数组并提取第一个字母并检查部分来完成此操作。另外我需要检查第一个字母是否是字母,如果是,我必须添加该部分,否则该部分将是'#' (与iphone联系人app相同)

3 个答案:

答案 0 :(得分:3)

将此方法添加到您的关键字类:

var sectionName : String {
    return keyword.substringToIndex(1) ?? "?"
}

然后使用此代码为关键字创建节标题词典:

var sections = [String:[Keyword]]()

for k in keywords {
    let s = k.sectionName
    if let oldKeywords = sections[s] {
        var mutableOldKeywords = oldKeywords
        mutableOldKeywords.append(k)
        sections[s] = mutableOldKeywords
    } else {
        sections[s] = [k]
    }
}

答案 1 :(得分:0)

迅速4:

let newArray = arrayName.map{Array($0.name)[0]}

这将是字符数组。使用以下语法获取字符串。

String(newArray[index])

答案 2 :(得分:0)

如今(Swift 4+)分组分组变得非常舒适

let grouped = Dictionary(grouping: keywords, by: { String($0.keyword.first!) })

并将其映射到KeywordSection数组

let sections = grouped.map({ KeywordSection(section: Character($0.0), keywords: $0.1) }).sorted{$0.section < $1.section}