#swiftui
#swiftui
Вопрос:
В SwiftUI, как вы перебираете каждый символ в строке, используя ForEach?
Например
let some_string = "A⍺甲あ"
VStack {
ForEach(....) {....
Text(String(character_in_the_string))
}
}
Вывод
A
⍺
甲
あ
Ответ №1:
ForEach
требуется, чтобы переданное ему значение соответствовало RandomAccessCollection
. A String
является Sequence
, и его можно превратить в RandomAccessCollection
, превратив в Array
.
Используйте Array()
, чтобы превратить строку в [Character]
:
VStack {
ForEach(Array(some_string), id: .self) { character in
Text(String(character))
}
}
В общем, вы должны быть осторожны при выборе id
уникального символа. Поскольку some_string
может содержать повторяющиеся символы, вы могли бы вместо этого использовать .enumerated()
для превращения каждого из них Character
в (offset, element)
пару (где offset
— его позиция в String
). Затем используйте .offset
как id
и .element
для извлечения Character
из пары кортежей:
VStack {
ForEach(Array(some_string.enumerated()), id: .offset) { character in
Text(String(character.element))
}
}
Это имело бы значение, например, если бы вы анимировали удаление символов из строки. Если вы используете символ в качестве .id
, SwiftUI может выбрать неправильный символ для анимации, если несколько одинаковых символов перечислены в строке.
Ответ №2:
let yourString = Array("A⍺甲あ") // convert your string to an array
VStack {
ForEach(0..<yourString.count) { num in
Text(String(yourString[num]))
}
}
Вывод:
A
⍺
甲
あ