Компилятор не может проверить это выражение за разумное время SwiftUI

#swift #swiftui

#swift #swiftui

Вопрос:

я пытаюсь показать, что разные навигации зависят от моих данных. Но я получаю сообщение об ошибке «Компилятор не может проверить это выражение в разумные сроки; попробуйте разбить выражение на отдельные подвыражения». Я знаю, что в основном это говорит о разделении вашего кода, но я не смог найти никакого решения для своего проекта. У кого-нибудь есть идеи об этой проблеме?

 var body: some View {
        
        ZStack{
            
            NavigationView{
                
                ScrollView{
                    
                    LazyVStack{
                        
                        ForEach(storeArray,id:.id) { item in
                            
                            if item.type == StoreItemType.store_Index.rawValue {
                                
                            NavigationLink(destination:Text("STORE AÇILACAK") ) {
                                
                                Image(uiImage: (item.banner?.url)!.load())
                                    .resizable()
                                    .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                                    .cornerRadius(12)
                                    .shadow(radius: 4)
                                    .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
                                    
                                    

                            }
                            } else if item.type == StoreItemType.store_link.rawValue {
                                
                                switch item.data?.type {
                                
                                case StoreDataType.html_Content.rawValue:
                                    
                                    NavigationLink(destination:Text("WebView Açılacak") ) {
                                        
                                        Image(uiImage: (item.banner?.url)!.load())
                                            .resizable()
                                            .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                                            .cornerRadius(12)
                                            .shadow(radius: 4)
                                            .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
                                        
                                            

                                    }

                                case StoreDataType.product_List.rawValue:
                                    
                                    NavigationLink(destination:Text("Ürün Liste Açılacak") ) {
                                        
                                        Image(uiImage: (item.banner?.url)!.load())
                                            .resizable()
                                            .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                                            .cornerRadius(12)
                                            .shadow(radius: 4)
                                            .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
                                        
                                    }
                                    
                                case StoreDataType.product_Detail.rawValue:
                                    
                                    NavigationLink(destination:Text("Ürün Detay açılacak") ) {
                                        
                                        Image(uiImage: (item.banner?.url)!.load())
                                            .resizable()
                                            .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                                            .cornerRadius(12)
                                            .shadow(radius: 4)
                                            .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
                                        
                                    }
                                default:
                                    
                                    print("Something Happened")
                                }
                            
                            }
                            
                        }
                    }
                }
                
                .navigationBarTitle(Text("United Apps"))
                
            }
            .onAppear {
                
                if isOpened != true {
                    
                    getStoreResponse()
                    
                }
                
            }
            
            ActivityIndicator(isAnimating: $isAnimating)
            
        }
    }
    
    func getStoreResponse() {
        
        DispatchQueue.main.async {
            
            store.storeResponse.sink { (storeResponse) in
                
                isAnimating = false
                
                storeArray.append(contentsOf: storeResponse.items!)
                
                isOpened = true
                
            }.store(in: amp;cancellable)
            
            store.getStoreResponse()
            
        }
        
    }
}
 

Комментарии:

1. Как только вы увидите такую ошибку, начните разбивать свой огромный вид на меньшие подвиды … и это хорошая практика делать это с самого начала — если ваш вид длиннее пары десятков строк — отделите его.

Ответ №1:

В вашем коде у вас есть общее представление навигации, поэтому сначала создайте одну структуру для представления навигации и передайте данные требований в структуру. и в главном представлении содержимого просто вызовите эту структуру. Таким образом, вы можете разбить свой код и легко поддерживать свой файл просмотра и находить недостающие части и проблемы.

Фрагмент кода: структура навигации

 struct NavigationImageView: View {
    
    var item: YourItemType
    var destinationText: String
    
    var body: some View {
        NavigationLink(destination:Text(destinationText) ) {
            
            Image(uiImage: (item.banner?.url)!.load())
                .resizable()
                .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                .cornerRadius(12)
                .shadow(radius: 4)
                .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
            
        }
    }
}
 

Ваш основной вид содержимого

 struct ContentView: View {
    var body: some View {
        ZStack{
            NavigationView{
                ScrollView{
                    LazyVStack{
                        ForEach([],id:.self) { item in
                            
                            if item.type == StoreItemType.store_Index.rawValue {
                                NavigationImageView(item: item, destinationText: "STORE AÇILACAK")
                                
                            } else if item.type == StoreItemType.store_link.rawValue {
                                
                                switch item.data?.type {
                                
                                case StoreDataType.html_Content.rawValue:
                                    NavigationImageView(item: item, destinationText: "WebView Açılacak")
                                
                                    
                                case StoreDataType.product_List.rawValue:
                                    NavigationImageView(item: item, destinationText: "Ürün Liste Açılacak")
                             
                                    /*----------------------------------------
                                     Other case and end code here
                                    /*----------------------------------------