从过滤器到结构只接收一个数据

时间:2017-02-04 06:19:32

标签: swift struct filter swift3

简短的问题,我有以下结构,我存储在“Salas”

struct SalasMaster {
    let id: Int
    let nombre: String
    let latitud: String
    let longitud: String
    let piso: String
    let observaciones: String
    let pabellon: String
}

var Salas = [SalasMaster]()

...receiving data...
...dump(Salas)
        example -> SalasMaster
                   - id: 307
                   - nombre: "SALA DE PROYECTOS "
                   - latitud: "-29.96429300"
                   - longitud: "-71.34937300"
                   - piso: "1"
                   - observaciones: ""
                   - pabellon: "X - Escuela de Ingeniería"

最后我想要的是过滤示例id,此时我得到一个数组,以及所有其他相应的数据

...filter data...

var arrayFiltered = Salas.filter{$0.id == 307}

Print(arrayFiltered) -> [SalasMaster(id: 307, nombre: "SALA DE PROYECTOS ", latitud: "-29.96429300", longitud: "-71.34937300", piso: "1", observaciones: "", pabellon: "X - Escuela de Ingeniería")]

但是我找不到只返回一个我感兴趣从“id”中检索的数据的方法,在这种情况下我只想捕获“latitud”,尽管在另一种情况下我可能需要另一个。

3 个答案:

答案 0 :(得分:0)

您可以使用first(where:),因为它会为您提供第一个匹配的记录,并在其后停止搜索。

if let sale = Salas.first(where: { $0.id == 307 }) {
    print(sale.latitud)
}

答案 1 :(得分:0)

这将映射Salas并返回latitud s的数组。

Salas.flatMap { $0.id == 307 ? $0.latitud : nil }

例如

var arrayFiltered = Salas.flatMap { $0.id == 307 ? $0.latitud : nil }

Print(arrayFiltered) -> ["-29.96429300"]

答案 2 :(得分:0)

struct SalasMaster {
  let id: Int
  let nombre: String
  let latitud: String
}

// creating the array
let sala1 = SalasMaster(id: 1, nombre: "Sala1", latitud: "123")
let sala2 = SalasMaster(id: 2, nombre: "Sala2", latitud: "321")
let salas = [sala1, sala2]

let idToFind = 1
let latitudFound = salas
                        .first { $0.id == idToFind } // returns the object found
                        .map   { $0.latitud } // we transform the object

if let latitudFound = latitudFound {
  print(latitudFound) // 123
}

或者如果您希望获得多个您感兴趣的字段,可以使用元组

let idToFind = 1
let salaFound = salas
                     .first { $0.id == idToFind } // returns the object found
                     .map   { (latitud: $0.id, nombre: $0.nombre) } // returns a tuple

if let sala = salaFound {
  print(sala.latitud) // 123
  print(sala.nombre) // Sala1
  //print(sala.id) // (latitud: Int, nombre: String) has no member 'id'
}