如何用另一个结构填充结构体

时间:2022-09-06 11:23:01

My app in Xcode with swift language programming :

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

I have a struct like:

我有一个结构体:

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

And then I have the values in: filters are coming from API and i am saving them to extractedFilter

然后我有了这些值:过滤器来自于API,我将它们保存到提取过滤器中。

if let filters = filters {
    for filter in filters {

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

    }
}

I have an array of page filter like :

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

lazy var availableFilters = Array<PageFilter>()

I want to fill the availableFilters with ExtractedFilter.

我想用提取过滤器来填充可用的过滤器。

******* *i fixed the issue by a loop like this code :

******* ******* **我通过如下代码循环修复了这个问题:

 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),"
                }
            }

thanks to all*

感谢所有*

3 个解决方案

#1


1  

The following Swift 1.2 playground code would do it - I have put in a function to simulate the call to the API

下面的Swift 1.2游乐场代码可以做到这一点——我添加了一个函数来模拟对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)")
}

Alternatively you could have your lazy var like this

或者你也可以这样做。

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 []
    }
}()

The code is similar to Leonardo's answer, the main difference being the use of the map function instead of for ... in ...

代码与达芬奇的答案相似,主要的区别在于使用了map函数而不是for…在…

#2


0  

Try like this:

试试这样:

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"

#3


0  

I fixed the issue by a loop like this:

我用这样一个循环来解决这个问题:

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),"
    }
}

#1


1  

The following Swift 1.2 playground code would do it - I have put in a function to simulate the call to the API

下面的Swift 1.2游乐场代码可以做到这一点——我添加了一个函数来模拟对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)")
}

Alternatively you could have your lazy var like this

或者你也可以这样做。

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 []
    }
}()

The code is similar to Leonardo's answer, the main difference being the use of the map function instead of for ... in ...

代码与达芬奇的答案相似,主要的区别在于使用了map函数而不是for…在…

#2


0  

Try like this:

试试这样:

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"

#3


0  

I fixed the issue by a loop like this:

我用这样一个循环来解决这个问题:

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),"
    }
}