2017-02-04 156 views
0

短的问题,我有以下的结构,这是我在“萨拉斯”接收来自过滤器只有一个数据结构

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”,但在另一种情况下,我可能需要另一个。

+0

所以你会l ike通过id过滤'Salas'或者其他的东西,然后返回'latitud'的列表? – Callam

回答

0

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

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

它适合你吗? –

+0

对于id搜索的情况下,它也似乎是一个非常有效的想法:)我也需要它。谢谢! –

+0

那么,关于我的问题,你是对的,道歉! –

0

这将通过映射和Salas返回latitud秒的阵列。

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

例如

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

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

有趣的解决方案,但一些低效的,因为它会遍历甚至成立所需的一个全阵列,理想情况下,一旦需要的项目被发现应停止迭代。 – Wilson

+0

我需要这个!在整个应用程序中,我需要同时制作多个滤镜,所以我需要浏览整个阵列“Salas”。谢谢! –

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' 
} 
+0

本质上与Nirav D的答案很相似,但我可能需要直接用你的代码保存这个元组:)谢谢! –

+0

没问题的人! – Wilson