#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
/*----------------------------------------