如何使用@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)
}
}
}
我正在尝试根据用户在之前的视图中选择的国家/地区制作一个城市列表。我已使用@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)
}
}
}