【问题标题】:Swift get first letter from property in array of custom objectsSwift从自定义对象数组中的属性中获取第一个字母
【发布时间】:2015-07-06 05:54:17
【问题描述】:

我有一个自定义对象

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 -> 牛
  3. s -> sdg, 萨克斯
  4. t -> 尝试

我创建了另一个对象来存储上述数据

class KeywordSection
{
    var section : Character
    var keywords : [Keyword]

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

我在 Android 中通过循环遍历数组并提取第一个字母并检查各个部分来做到这一点。另外我需要检查第一个字母是否是字母,如果是我必须添加该部分,否则该部分将是“#”(与 iphone 联系人应用程序相同)

【问题讨论】:

  • 您可以在使用 Bridge 的 swift 项目中使用 Objective c 方法吗?
  • @PavanJangid 对不起,我只能使用 swift 方法,或者我需要编写自定义方法
  • 您可以从此链接获得参考,并且您必须将代码从目标 c 转换为 swift:stackoverflow.com/questions/24342542/… 请参阅上面链接中的最后一个答案
  • 这是您问题的 Swift 代码。 nshipster.com/uilocalizedindexedcollation
  • @Sajeel,我在四天前回答了同样的问题。但这是客观的 - c。我认为您将目标转换为 swift 并不难。这是链接。 stackoverflow.com/questions/31201038/…

标签: ios swift uitableview


【解决方案1】:

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

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]
    }
}

【讨论】:

  • 谢谢@Aderstedt。新创建的sections字典也没有排序,如何实现排序
  • 字典未排序,但您可以使用sections.keys.array.sorted(<)获取排序后的键
【解决方案2】:

斯威夫特 4:

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

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

String(newArray[index])

【讨论】:

    【解决方案3】:

    现在(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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2012-06-08
      • 2022-11-27
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      相关资源
      最近更新 更多