如何在 SwiftUI 列表中获取行索引?
How to get row index in SwiftUI List?
我想要一个编号列表,其中每一行都有一个数字。
像这样
但我在 List
初始化程序
中看不到正确的 API
此刻我看到了这个解决方法
var persons = ["Boris", "Anna", "Tom"]
// MARK: - Body
func body(props: Props) -> some View {
List(persons.indices, id: \.self) { index in
Text("\(index) \(self.persons[index])")
}
}
使用 .indices() 不是解决方法,而是一种正确的方法。
或者,您也可以将发行说明中的代码用于 indexed() 数组:
struct ContentView: View {
var persons = ["Boris", "Anna", "Tom"]
var body: some View {
VStack {
List(persons.indexed(), id: \.1.self) { idx, person in
Text("\(idx) - \(person)")
}
}
}
}
// This is taken from the Release Notes, with a typo correction, marked below
struct IndexedCollection<Base: RandomAccessCollection>: RandomAccessCollection {
typealias Index = Base.Index
typealias Element = (index: Index, element: Base.Element)
let base: Base
var startIndex: Index { base.startIndex }
// corrected typo: base.endIndex, instead of base.startIndex
var endIndex: Index { base.endIndex }
func index(after i: Index) -> Index {
base.index(after: i)
}
func index(before i: Index) -> Index {
base.index(before: i)
}
func index(_ i: Index, offsetBy distance: Int) -> Index {
base.index(i, offsetBy: distance)
}
subscript(position: Index) -> Element {
(index: position, element: base[position])
}
}
extension RandomAccessCollection {
func indexed() -> IndexedCollection<Self> {
IndexedCollection(base: self)
}
}
你可以直接使用enumerated
,例如https://github.com/onmyway133/blog/issues/515
struct CountriesView: View {
let countries: [Country]
var body: some View {
let withIndex = countries.enumerated().map({ [=10=] })
return List(withIndex, id: \.element.name) { index, country in
NavigationLink(
destination: CountryView(country: country),
label: {
VStack(alignment: .leading) {
Text(country.name)
.styleMultiline()
}
.paddingVertically()
}
)
}
}
}
这是 Apple 示例:
var landmarkIndex: Int {
userData.landmarks.firstIndex(where: { [=10=].id == landmark.id })!}
给你:
var persons = ["Boris", "Anna", "Tom"]
// MARK: - Body
func body(props: Props) -> some View {
List(persons.indices, id: \.self) { index in
var i: Int {
persons.firstIndex(where: { [=11=].id == index.id })!}
Text("\(i) \(self.persons[i])")
}}
我想要一个编号列表,其中每一行都有一个数字。
像这样
但我在 List
初始化程序
此刻我看到了这个解决方法
var persons = ["Boris", "Anna", "Tom"]
// MARK: - Body
func body(props: Props) -> some View {
List(persons.indices, id: \.self) { index in
Text("\(index) \(self.persons[index])")
}
}
使用 .indices() 不是解决方法,而是一种正确的方法。
或者,您也可以将发行说明中的代码用于 indexed() 数组:
struct ContentView: View {
var persons = ["Boris", "Anna", "Tom"]
var body: some View {
VStack {
List(persons.indexed(), id: \.1.self) { idx, person in
Text("\(idx) - \(person)")
}
}
}
}
// This is taken from the Release Notes, with a typo correction, marked below
struct IndexedCollection<Base: RandomAccessCollection>: RandomAccessCollection {
typealias Index = Base.Index
typealias Element = (index: Index, element: Base.Element)
let base: Base
var startIndex: Index { base.startIndex }
// corrected typo: base.endIndex, instead of base.startIndex
var endIndex: Index { base.endIndex }
func index(after i: Index) -> Index {
base.index(after: i)
}
func index(before i: Index) -> Index {
base.index(before: i)
}
func index(_ i: Index, offsetBy distance: Int) -> Index {
base.index(i, offsetBy: distance)
}
subscript(position: Index) -> Element {
(index: position, element: base[position])
}
}
extension RandomAccessCollection {
func indexed() -> IndexedCollection<Self> {
IndexedCollection(base: self)
}
}
你可以直接使用enumerated
,例如https://github.com/onmyway133/blog/issues/515
struct CountriesView: View {
let countries: [Country]
var body: some View {
let withIndex = countries.enumerated().map({ [=10=] })
return List(withIndex, id: \.element.name) { index, country in
NavigationLink(
destination: CountryView(country: country),
label: {
VStack(alignment: .leading) {
Text(country.name)
.styleMultiline()
}
.paddingVertically()
}
)
}
}
}
这是 Apple 示例:
var landmarkIndex: Int {
userData.landmarks.firstIndex(where: { [=10=].id == landmark.id })!}
给你:
var persons = ["Boris", "Anna", "Tom"]
// MARK: - Body
func body(props: Props) -> some View {
List(persons.indices, id: \.self) { index in
var i: Int {
persons.firstIndex(where: { [=11=].id == index.id })!}
Text("\(i) \(self.persons[i])")
}}