2016-11-25 84 views
-1

我已經搜索了這個問題,我沒有找到任何解決方案,爲我使用最新版本的Xcode和Swift。我使用三個陣列:如何用swift過濾其他數組值的結構數組?

1. baseArray[Meal]: array filled with every meal. Not locally saved. 

2. favoritesArray[Favorite]: with names of all favorite meals, locally saved by the user with NSKeyedArchiver. 
3. filteredArray[Meal]: baseArray but filtered for searchterm. In code: 

    (filteredArray = baseArray.filter { $0.type == searchtext }} 

我使用tableView中的最後一個數組。如果他們想要看到所有餐點,則filteredArraybaseArray相同。

我的問題:我怎麼能得到filteredArray,它有所有喜愛的食物(所以在哪裏Meal.title == Favorite.name)。我如何結合三個陣列?

我在上週嘗試了很多選擇,但都沒有工作..我希望你能幫助我!

+0

'filteredArray = baseArray.filter {$ 0.type == search text && favoritesArray.contains($ 0.type)}'? (你可能想首先將favoritesArray轉換爲Set) – hnh

回答

0

這你想要做什麼:

struct Meal { 
    let title: String 
} 

struct Favorite { 
    let name: String 
} 

let meal1 = Meal(title: "Soup") 
let meal2 = Meal(title: "Stew") 
let meal3 = Meal(title: "Pizza") 

let favorite1 = Favorite(name: "Stew") 

let baseArray = [meal1, meal2, meal3] 
let favoritesArray = [favorite1] 

let favoriteNames = favoritesArray.map { $0.name } 

let filteredArray = baseArray.filter { favoriteNames.contains($0.title) } 
+0

Thx很多!這是工作;我已經有了一個favoriteArray,所以我不需要再次聲明它。最喜歡的名字是訣竅! – mkw1975

0

這是你的解決方案,如果我正確地理解你的問題。

struct Meal { 
    let name: String 
} 

struct Favorite { 
    let name: String 
} 

let baseArray = [Meal(name: "Meal1"), Meal(name: "Meal2"), Meal(name: "Meal3")] 

let favoritesArray = [Favorite(name: "Meal1")] 

let searchText = "Meal3" 

let filteredArray = baseArray.filter { $0.name == searchText } 
print(filteredArray) 
// [Meal(name: "Meal3")] 

let combinedArray = baseArray.reduce(filteredArray) { array, element in 
    // First condition check if the current meal (element) in contained in the favorites 
    // Second checks if the favorite meal isn't already in the filteder array 
    if favoritesArray.contains(where: { $0.name == element.name }) && 
     !filteredArray.contains(where: { $0.name == element.name }) { 
     return array + [element] 
    } 
    return array 
} 

print(combinedArray) 
// [Meal(name: "Meal3"), Meal(name: "Meal1")]