Для каждого символа в строке

#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 
 
甲 
あ