【问题标题】:How do I combine array sections programmatically?如何以编程方式组合数组部分?
【发布时间】:2018-01-09 19:52:12
【问题描述】:

与必须在 return 语句中指定每个部分相比,我如何最好地以编程方式将它传回 x 个部分?有没有办法循环和组合这些,然后为我的 UserSettings.Sections[x] 返回组合数组?

我目前的退货声明:

return [self.loadFAQs(), self.loadX(section: UserSettings.Sections[0]), self.loadX(section: UserSettings.Sections[1])]

class func getZendeskFAQs() -> [ZendeskFaqs] {

    // Clear storage
    clearDataFAQs()

    let count = loadArticles(labels: UserSettings.Sections)
    print("total articles loaded: ", count)

    // the number of self.loadX sections will vary... how do I do this and return?
    return [self.loadFAQs(), self.loadX(section: UserSettings.Sections[0]), self.loadX(section: UserSettings.Sections[1])]


}

// MARK - Private methods to load data
private class func loadFAQs() -> ZendeskFaqs {
    var faqs = [ZendeskFaq]()
    faqs.append(ZendeskFaq(titled: "faq 1.1"))
    faqs.append(ZendeskFaq(titled: "faq 1.2"))
    faqs.append(ZendeskFaq(titled: "faq 1.3"))
    return ZendeskFaqs(section: "Set 1", includeFAQs: faqs)
}
private class func loadX(section: String) -> ZendeskFaqs {
    var faqs = [ZendeskFaq]()

    var myIndex = 0

    while myIndex < articleData.count {
        if section == articleData[myIndex].label_name {
            faqs.append(ZendeskFaq(titled: articleData[myIndex].title))
        }
        myIndex = myIndex + 1
    }
    return ZendeskFaqs(section: section, includeFAQs: faqs)
}

【问题讨论】:

  • 您的意思是您想要一个[ZendeskFaq] 类型的Array,还是只想创建您的return 语句而不对函数调用进行硬编码?
  • 您可以使用 .flatmap 来加入嵌套数组。你可以像这样返回数组 'func this() -> [that] {}'
  • 您可以执行[[self.loadFAQs], UserSettings.Sections.map({ loadX(section: $0) })].flatMap({ $0 }),这只会为您提供一个包含上述所有内容的数组..但不清楚您真正想要什么..
  • 对不起,这很难解释,但基本上我有三个数组(相同的数组格式)我要返回。每个都是一个部分,以便它们在带有部分的表格视图中分解。问题是 loadX 部分的数量会变化“x”,所以有一次我可能只有 LoadFAQs 和 2 个 loadX。下次运行应用程序时(基于对源数据的更改),我可能会使用 5 个或其他数量的 loadX 部分。我尝试了平面图,但出现了 sigbart 错误:return [[self.loadFAQs], UserSettings.Sections.map({ loadX(section: $0) })].flatMap({ $0 }) as! [Zendesk 常见问题解答]
  • 或者我想我可以说每次加载表格时如何将数据添加到具有不同数量部分的表格中?我正在一次读取数据以计算这些数据。然后再次读取数据并加载到该部分的正确数组。将各个部分相加,然后显示在我的表格中。

标签: ios arrays swift sections


【解决方案1】:

您需要学习使用 Swift 中用于集合的漂亮方法,例如 mapfilterflatMap。我建议阅读这些内容,至少在 Xcode 中可用的文档中阅读。

试试这个代码:

class func getZendeskFAQs() -> [ZendeskFaqs] {

    // Clear storage
    clearDataFAQs()

    let count = loadArticles(labels: UserSettings.Sections)
    print("total articles loaded: ", count)

    return [self.loadFAQs()] + UserSettings.Sections.map { self.loadX(section: $0) }
}

// MARK - Private methods to load data
private class func loadFAQs() -> ZendeskFaqs {
    var faqs = [ZendeskFaq]()
    faqs.append(ZendeskFaq(titled: "faq 1.1"))
    faqs.append(ZendeskFaq(titled: "faq 1.2"))
    faqs.append(ZendeskFaq(titled: "faq 1.3"))
    return ZendeskFaqs(section: "Set 1", includeFAQs: faqs)
}

private class func loadX(section: String) -> ZendeskFaqs {
    let faqs = articleData
        .flatMap { article -> ZendeskFaq? in
            guard section == article.label_name else {
                return nil
            }
            return ZendeskFaq(titled: article.title)
        }

    return ZendeskFaqs(section: section, includeFAQs: faqs)
}

为了获取数组中的所有元素,您可以使用map 函数将其从一种类型转换为另一种类型。正如您在我的代码示例中看到的那样,您可以通过这种方式将所有部分映射到您的 ZendeskFaqs 对象中。

顺便说一句,您也不需要像 myIndex 那样使用索引计数器。你可以简单地调用类似的东西:

for article in articleData {
   if section == article.label_name {
      ...
   }
}

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2012-09-23
    • 2015-02-25
    • 1970-01-01
    • 2014-08-16
    • 2015-08-18
    相关资源
    最近更新 更多