2016-07-20 4 views
2

Я хочу искать объекты, созданные struct.Поиск объектов, созданных struct

Предположим, что это наши объекты, созданные Candy struct.

candies = [ 
    Candy(category:"Chocolate", name:"Chocolate Bar"), 
    Candy(category:"Chocolate", name:"Chocolate Chip"), 
    Candy(category:"Chocolate", name:"Dark Chocolate"), 
    Candy(category:"Hard", name:"Lollipop"), 
    Candy(category:"Hard", name:"Candy Cane"), 
    Candy(category:"Hard", name:"Jaw Breaker"), 
    Candy(category:"Other", name:"Caramel"), 
    Candy(category:"Other", name:"Sour Chew"), 
    Candy(category:"Other", name:"Gummi Bear") 
] 

Как мы можем найти категорию «Lollipop» элемент без создания двух массивов и поиск объекта по их индексам?

ответ

3

Просто это:

candies.first { $0.name == "Lollipop" } 

Если вы ожидаете там быть больше, чем один "Lollipop", то:

candies.filter { $0.name == "Lollipop" } 

В действии:

13> struct Candy { 
14.  let cat: String 
15.  let name: String 
16. } 
17> var candies = [ 
18.  Candy (cat: "Hard", name: "Lollipop"), 
19.  Candy (cat: "Hard", name: "Jaw Breaker") 
20.  ] 
candies: [Candy] = 2 values { 
    [0] = { 
    cat = "Hard" 
    name = "Lollipop" 
    } 
    [1] = { 
    cat = "Hard" 
    name = "Jaw Breaker" 
    } 
} 

21> candies.first { $0.name == "Lollipop" } 
$R1: Candy? = (cat = "Hard", name = "Lollipop") 

22> candies.filter { $0.name == "Lollipop" } 
$R2: [Candy] = 1 value { 
    [0] = { 
    cat = "Hard" 
    name = "Lollipop" 
    } 
} 
+2

Ваши 'candies.first {$ 0.name ==" Lollipop "}' очень крутые. Но я боюсь, что это только для Swift 3: в Swift 2 '.first' является только свойством для первого объекта в массиве, нет метода, который бы принял такой предикат. Стоит упомянуть, ИМО. – Moritz

1

Вы можете попробовать это:

if let found = find(lazy(array).map({ $0.name }), "Foo") { 
    let obj = array[found] 
} 
+0

Извините, это был старый. candies.first {$ 0.name == "Candyname"} должен сделать трюк. –

+0

Это был Swift 1? Я думал, что это так, но я не узнал, не был уверен. Этот синтаксис не был идеальным, это хорошо, что они изменили его. :) – Moritz

+0

Swift 3 сделает его еще лучше;) –

Смежные вопросы