#swiftui
#swiftui
Вопрос:
Я создал пользовательскую структуру, которая создает собственный customId, я мог бы использовать этот customId в качестве идентификатора для ForEach в режиме элемента, затем я попытался использовать свой собственный customId в качестве идентификатора для ForEach в режиме индексов, но он выдает ошибку, в нем говорится, что Int не имеет члена customId, что и является причиной создания customId было и есть не использовать Int в качестве идентификатора, а использовать мой собственный customId. Как я мог бы решить эту проблему?
struct ContentView: View {
@State var arrayOfCustomStruct: [CustomStruct] = [CustomStruct]()
var body: some View {
Spacer()
// VStack {
//
// ForEach (arrayOfCustomStruct, id: .customID) { item in
//
// Text( String(item.customID) )
//
// }
//
// }
VStack {
ForEach (arrayOfCustomStruct.indices, id:.self) { index in // << here I want this happen: -----> id: .customID
Text( String(arrayOfCustomStruct[index].customID) )
}
}
Spacer()
HStack {
Spacer()
Button("add new item") {
arrayOfCustomStruct.append( CustomStruct(name: "New Item") )
}
Spacer()
Button("remove an item") {
if arrayOfCustomStruct.count > 0 {
arrayOfCustomStruct.remove(at: arrayOfCustomStruct.count-1 )
}
}
Spacer()
}.padding()
}
}
struct CustomStruct {
init(name: String) {
CustomStruct.indexOfId = 1
self.name = name
}
private static var indexOfId: UInt64 = 0
let customID: UInt64 = CustomStruct.indexOfId
var name: String
}
Обновление: customId в Int имеет совершенно другую индивидуальность, чем customId в CustomStruct! Он НЕ идеален как CustomStruct.
extension Int {
private static var indexOfId: Int = -1
var customID: Int {
Int.indexOfId = 1
return Int.indexOfId
}
}
Комментарии:
1. вы читали мой заголовок? Пользовательский! UUID не является пользовательским.
Ответ №1:
Если вы хотите иметь как индексы, так и идентификатор по элементу, вы можете использовать enumerated, например
ForEach (Array(arrayOfCustomStruct.enumerated()), id:.1.customID) { index, item in
Text( String(arrayOfCustomStruct[index].customID) )
}
Комментарии:
1. Это работает, но как я мог просто использовать index? Вот моя идея, дайте мне знать, если я ошибаюсь или прав? Когда мы просто используем режим элемента ForEach, идентификатор переходит и находит наш пользовательский идентификатор, а затем синхронизируется с ним! Но когда мы используем только индексный режим, ForEach не получает доступа к нашему пользовательскому идентификатору, потому что он просто заботится о диапазоне! И поскольку Range является типом Int, он пытается найти customId внутри Int для синхронизации! но он не может его найти! потому что customId является свойством CustomStruct, а не Int. Правильно ли это до сих пор?
2. зная также, что struct не могут наследовать друг от друга, тогда невозможно использовать только индексный режим ForEach с customId, верно?
3. Ну … вероятно, вы застряли с термином «режим» — никакого «режима» нет, ForEach просто выполняет итерацию с коллекцией и использует id как свойство элемента из коллекции. Поэтому, когда вы используете
arrayOfCustomStruct.indices
, вы не выполняете итерацию arrayOfCustomStruct в режиме индексов , вы просто выполняете итерацию по диапазону целых чисел, поэтому id может быть только тем, что доступно для Int. (Конечно, вы можете добавить расширение к Int с помощью свойства calculable и использовать его в качестве ID, но это не меняет смысла).4. @ Asperi: Вы только что сказали все, что я сказал, в правильном синтаксисе, также я просто воспользовался вашим советом о расширении! Теперь у Int есть доступ к customId. проверьте мое обновление, оно также работает в индексном режиме.