如何使用@Binding 属性过滤数组?

How to filter an array with @Binding property?

我正在尝试根据用户在之前的视图中选择的国家/地区制作一个城市列表。我已使用@Binding 成功地将所选国家/地区的值传递给 CityListView。我正在尝试根据所选国家/地区过滤一系列城市。

这是我目前所掌握的。但是,它会显示 cities 数组中的所有城市。

@Binding var selectedCountry: String

let LosAngeles = City(name: "Los Angeles", country: "United States")
    let Madrid = City(name: "Madrid", country: "Spain")
    
    let cities = [LosAngeles, Madrid]
    
    let countryCities = cities.map { [=11=].country }
    
    let filteredCities = cities.filter {_ in countryCities.contains(self.selectedCountry)}




List {

ForEach(filteredCities) { city in
    
    CityListRow(city: city, selectedCity: self.selectedCity)
    .onTapGesture {
        self.showCityListView.toggle()
        self.selectedCity = city.name
    }
        
}

}

放在body里面,否则绑定不生效:

ForEach(cities.filter { [=10=].country == self.selectedCountry }) { city in
    
    CityListRow(city: city, selectedCity: self.selectedCity)
    .onTapGesture {
        self.showCityListView.toggle()
        self.selectedCity = city.name
    }
}

使用以下过滤语句:

self.filteredCities = cities.filter { city in
    return city.country.contains(selectedCountry.wrappedValue)
}

这里是完整的代码:

struct ContentView : View {
    var cities = ["Spain", "United States"]
    
    var body : some View {
        NavigationView {
            List {
                ForEach(cities, id:\.self) { city in
                    NavigationLink(city, destination: DetailView(selectedCountry: .constant(city)))
                }

            }
        }
    }
}

struct City : Hashable {
    var name : String
    var country : String
}

struct DetailView : View {
    @Binding var selectedCountry : String
        
    let filteredCities : [City]
    
    init(selectedCountry: Binding<String>) {
        self._selectedCountry = selectedCountry
        
        let LosAngeles = City(name: "Los Angeles", country: "United States")
        let Madrid = City(name: "Madrid", country: "Spain")
            
        let cities = [LosAngeles, Madrid]
                    
        self.filteredCities = cities.filter { city in
            return city.country.contains(selectedCountry.wrappedValue)
        }
    }
    
    var body : some View {
        ForEach(filteredCities, id:\.self) { city in
            Text(city.name)
        }
    }
}