【问题标题】:how to fill <array> struct by another struct如何用另一个结构填充 <array> 结构
【发布时间】:2015-04-22 11:10:06
【问题描述】:

我在 Xcode 中使用 swift 语言编程的应用程序:

我有一个类似的结构:

struct PageFilter {
    var key: Int?
    var title: NSString?
}

然后我有以下值: 过滤器来自 API,我将它们保存到提取过滤器

if let filters = filters {
    for filter in filters {

        var extractedFilter = PageFilter()
        extractedFilter.key = filter["key"].integerValue
        extractedFilter.title = filter["title"].stringValue 

    }
}

我有一个页面过滤器数组,例如:

lazy var availableFilters = Array<PageFilter>()

我想用ExtractedFilter 填充availableFilters

********* *我通过这样的代码循环解决了这个问题:

 var strFilter : String = ""

            for var i = 0; i < self.newFilterList.availableGuildFilters.count; i++ {
                let guildFilter = self.newFilterList.availableGuildFilters[i]
                if guildFilter.selected {
                    strFilter += "\(guildFilter.key),"
                }
            }

感谢大家*

【问题讨论】:

  • 如果让过滤器 = 过滤器 { ... 你的代码在这里过滤它不是可选的 } 这就是你如何打开一个可选的
  • 我想这样做 availableFilters = Extended Filter 但我不能,因为 extendedFilter 不是数组!
  • 您甚至没有显示您声明扩展过滤器的位置和方式。问题越好,人们就越容易理解你的问题。您应该尝试改进您的问题
  • 我的意思是 ExtractedFilter *

标签: arrays xcode swift


【解决方案1】:

下面的 Swift 1.2 Playground 代码可以做到这一点 - 我已经放入了一个函数来模拟对 API 的调用

//: Playground - noun: a place where people can play

import Cocoa

struct PageFilter {
    var key: Int?
    var title: NSString?
}

// this would be replaced by whatever way you get your filters from the API
func getFiltersFromApi() -> [PageFilter]? {
    // return nil // uncomment this line to demo the API returning nothing
    return [PageFilter(key: 1, title: "one"),
        PageFilter(key: 2, title: "two"),
        PageFilter(key: 3, title: "three"),
        PageFilter(key: nil, title: nil)
    ]
}

let filters: [PageFilter]? = getFiltersFromApi() // API call, this could return nil
let extractedFilters: [PageFilter]

if let filters = filters {
    extractedFilters = filters.map { filter in
        PageFilter(key: filter.key, title: filter.title)
    }
} else {
    extractedFilters = []
}

for filter in extractedFilters {
    println("key: \(filter.key), title: \(filter.title)")
}

或者你也可以像这样拥有你的惰性变量

var availableFilters: [PageFilter] = {
    let filters: [PageFilter]? = getFiltersFromApi() // API call, this could return nil

    if let filters = filters {
        return filters.map { filter in
            PageFilter(key: filter.key, title: filter.title)
        }
    } else {
        return []
    }
}()

代码类似于 Leonardo 的回答,主要区别在于使用 map 函数而不是 for ... in ...

【讨论】:

    【解决方案2】:

    试试这样:

    struct PageFilter {
        var key = Int()
        var title = String()
    }
    
    
    var filters:[PageFilter]? = []
    filters = [PageFilter(key: 1, title: "one"), PageFilter(key: 2, title: "two"), PageFilter(key: 3, title: "three")]
    
    var extractedFilter = Array<PageFilter>()
    if let filters = filters {
        for filter in filters {
            extractedFilter.append(PageFilter(key: filter.key, title: filter.title))
        }
    }
    
    println(extractedFilter[1].key)   // "2"
    println(extractedFilter[1].title) // "two"
    

    【讨论】:

    • 您可以在过滤器数组上使用map 来创建提取的过滤器数组,例如let extractFilter = filters.map { filter in PageFilter(key: filter.key, title: filter.title) } 这将减少 for in 部分:)
    • stackoverflow.com/questions/29782982/…你为什么不教我如何使用过滤器和地图?
    • 我打算发布我的答案,但我认为因为它与你的相似(地图部分除外),所以我会发表评论并建议其中一部分的替代方案。显然暗示这是禁区……?
    • 没关系,我只是认为这样让 OP 更容易理解它。
    • 好的,我将其作为答案发布
    【解决方案3】:

    我通过这样的循环解决了这个问题:

    var strFilter : String = ""
    for var i = 0; i < self.newFilterList.availableGuildFilters.count; i++ {
        let guildFilter = self.newFilterList.availableGuildFilters[i]
        if guildFilter.selected {
            strFilter += "\(guildFilter.key),"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2014-10-12
      • 2012-08-14
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多