Как я могу использовать свой собственный customId в качестве идентификатора для ForEach в режиме индексов в SwiftUI?

#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. проверьте мое обновление, оно также работает в индексном режиме.