2016-10-26 5 views
1

構造を含む配列内の値の場所を探しようとしています。 私の配列は、場所を取得する方法は、すべての「ドウ」の配列のためにあります。このカスタムクラスを含む配列の値を見つける

struct User { 
var firstName: String? 
var lastName: String? 
} 

var allThePeople = [User(firstName: "John", lastName: "Doe"), User(firstName: "Jane", lastName: "Doe"), User(firstName: "John", lastName: "Travolta")]; 

のように見えますか? (この場合は0と1)

+0

フィルタリングされた配列または条件のインデックスが必要ですか? – Larme

答えて

4

allThePeopleをフィルタリングして、姓が "Doe"のすべての人を取得することができます。

let allTheDoes = allThePeople.filter { $0.lastName == "Doe" } 

配列を列挙し、インデックスの配列にフラットマップできます。

let allTheDoeIndexes = allThePeople.enumerated().flatMap { $0.element.lastName == "Doe" ? $0.offset : nil } 
        = allThePeople.enumerated().flatMap { $1.lastName == "Doe" ? $0 : nil } 
+1

クロージャは '{$ 1.lastName ==" Doe "に少し短縮できますか? $ 0:nil} ' - おそらく味の問題です。 –

+0

はい、私の答えを更新します – Callam

+0

あなたの 'フラットマップ'は私の 'for'ループの回答よりも簡潔です(私はあなたをアップしました) - 初心者にとってはあまりにも軽いかもしれません - – Grimxn

2

あなたは、実際のインデックスをしたい場合は、@Callamが示唆したようにそうfilterを使用

struct User { 
    var firstName: String? 
    var lastName: String? 
} 

var allThePeople = [User(firstName: "John", lastName: "Doe"), User(firstName: "Jane", lastName: "Doe"), User(firstName: "John", lastName: "Travolta")] 

var indices = [Int]() 
for i in 0 ..< allThePeople.count { 
    if allThePeople[i].lastName == "Doe" { 
     indices.append(i) 
    } 
} 
indices // [0,1] 

のようなものを使用。

関連する問題