2

My app in Xcode with swift language programming :

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

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*

Maryam Fekri
  • 605
  • 8
  • 19

3 Answers3

1

The following Swift 1.2 playground code would do it - I have put in a function to simulate the call to the 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 ...

ubersnack
  • 512
  • 6
  • 19
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"
Leo Dabus
  • 229,809
  • 59
  • 489
  • 571
  • You could use `map` on the filters array to create the extractedFilter array e.g. let extractedFilter = filters.map { filter in PageFilter(key: filter.key, title: filter.title) } this would cut down on the `for in` section :) – ubersnack Apr 22 '15 at 14:25
  • http://stackoverflow.com/questions/29782982/how-move-a-string-to-right-on-left/29783546#29783546 why don't you show me how to use filter and map? – Leo Dabus Apr 22 '15 at 16:48
  • I was going to post my answer but thought that as it was similar to yours (except for the map part) that instead I would comment and suggest an alternative to part of it. Apparently suggesting that is off limits...? – ubersnack Apr 23 '15 at 11:25
  • That's ok I just think it would be easier for the OP to understand it like this. – Leo Dabus Apr 23 '15 at 16:29
  • Ok I'll post it as an answer instead – ubersnack Apr 24 '15 at 08:51
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),"
    }
}
Pang
  • 9,564
  • 146
  • 81
  • 122
Maryam Fekri
  • 605
  • 8
  • 19