簡體   English   中英

“類型‘()’不能符合‘視圖’; 只有結構/枚舉/類類型可以符合協議”

[英]“Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols”

編輯:問題的解釋

此代碼產生一個錯誤,發布者不知道如何解決它。

這是上一篇文章的新編輯。

我在 >Geometry Reader 上收到錯誤消息。 這篇文章包括所有代碼。 這篇新帖子包括所要求的注冊和登錄代碼。 我希望它是可讀的格式。 我做了一些更正,希望對您有所幫助。 代碼如下:

import SwiftUI

struct ContentView: View {

    var body: some View {
       
            Home()
                // for light status bar...
            .preferredColorScheme(.dark)
            
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
    struct Home : View {
        
        @State var index = 0
    
        var body: some View{
            
            GeometryReader{ _ in // ( ERROR MESSAGE OCCURS HERE)--> ("Type '()' cannot conform to'View'; only struct/enum/class types can conform to protocols" and  "Required by generic struct 'GeometryReader' where 'Content' = '()'")
            
                VStack{
                
                    Image("logo")
                    .resizable()
                    .frame(width:60, height: 60)
                      
                    ZStack{
                        
                        SignUp(index: self.$index)
                            *// changing view order...*
                            .zIndex(Double(self.index))
                        
                        Login(index: self.$index)
                        
                        
                    }
                    
                    HStack(spacing: 15){
                        
                        Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                        
                        Text("OR")
                        
                        Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                    }
                    .padding(.horizontal, 20)
                    .padding(.top, 50)
                    *// because login button is moved 25 in y axis and 25 padding = 50*
                  
                    
.background(Color("Orange").edgesIgnoringSafeArea(.all))
                    
                    
                    //Curve...
                    
                    HStack(spacing: 25){
                    
                        Button(action: {
                            
                        }) {
                                 Image("Unknown")
                                 .resizable()
                                 .renderingMode(.original)
                                 .frame(width: 50, height: 50)
                                 .clipShape(Circle())
                     }
                                 Button(action: {
                                 }) {
                                     
                                     Image("fb")
                                     .resizable()
                                     .renderingMode(.original)
                                     .frame(width: 50, height: 50)
                                     .clipShape(Circle())
                    }
                                     
                                     Button(action: {
                                     }) {
                                         
                                         Image("instagram")
                                         .resizable()
                                         .renderingMode(.original)
                                         .frame(width: 50, height: 50)
                                         .clipShape(Circle())
                                    
                            }
}
                    .padding(.top, 30)
                }
                .padding(.vertical)
                


struct CShape: Shape {
    func path(in rect: CGRect) -> Path {
        
        return Path {path in
            
            *//right side curve...*
            
            path.move(to: CGPoint(x: rect.width, y: 100))
            path.addLine(to: CGPoint(x: rect.width, y: rect.height))
            path.addLine(to: CGPoint(x: 0, y: rect.height))
            path.addLine(to: CGPoint(x: 0, y: 0))
        }
    
}
}
        
        
    struct CShape1: Shape {
        func path(in rect: CGRect) -> Path {
            
            return Path {path in
                
                *//left side curve...*
                
                path.move(to: CGPoint(x: 0, y: 100))
                path.addLine(to: CGPoint(x: 0, y: rect.height))
                path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                path.addLine(to: CGPoint(x: rect.width, y: 0))
            }
        
    }
    }
                
struct Login : View {
            
            @State var email = ""
            @State var pass = ""
            @Binding var index : Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            VStack(spacing:10){
                                
                                Text("Login")
                                    .foregroundColor(self.index == 0 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 0 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                            
                            Spacer(minLength:0)
                        }
                        .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                .foregroundColor(Color("Blue"))
                           
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                    
                    VStack{
                        
                        HStack(spacing:15){
                            
                            Image(systemName: "eye")
                            .foregroundColor(Color("Orange"))
                       
                            SecureField("Password", text: self.$pass)
                        }
                        Divider().background(Color.white.opacity(0.5))
                    }
                    .padding(.horizontal)
                    .padding(.top, 30)
                        
                        HStack{
                            
                            Spacer(minLength: 0)
                            
                            Button(action: {
                                
                            }) {
                                
                                Text("Forget Password?")
                                    .foregroundColor(Color.white.opacity(0.6))
                            }
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                    // bottom padding...
                    .padding(.bottom, 65)
                    .background(Color("LightBlue"))
                    .clipShape(CShape())
                    .contentShape(CShape())
                    .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                    .onTapGesture{
                            
                        self.index = 0
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("LOGIN")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                        .background(Color("LightBlue"))
                        .clipShape(Capsule())
                        // shadow ...
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                    // moving view down...
                        .offset(y: 25)
                        .opacity(self.index == 0 ? 1 : 0)
                }
            }
        }
                
// SignUp Page...
        
struct SignUp : View {
                        
    @State var email = ""
    @State var pass = ""
    @State var Repass = ""
    @Binding var index: Int
                        
        var body : some View {
            
            ZStack(alignment: .bottom) {
                
                VStack{
                    
                    HStack{
                        
                        Spacer(minLength:0)
                        
                        VStack(spacing: 10){
                        
                            Text("SignUp")
                                .foregroundColor(self.index == 1 ? .white : .gray)
                                .font(.title)
                                .fontWeight(.bold)
                        
                            Capsule()
                                .fill(self.index == 1 ? Color.blue : Color.clear)
                                .frame(width:100, height: 5)
                        }
                    }
                    .padding(.top, 30)// for top curve...
                    VStack{
                        
                        HStack(spacing:15){
                            
                            Image(systemName: "envelope")
                            .foregroundColor(Color("Orange"))
                       
                            TextField("Email Adress", text: self.$email)
                        }
                        Divider().background(Color.white.opacity(0.5))
                    }
                    .padding(.horizontal)
                    .padding(.top, 40)
                
                    VStack{
                    
                    HStack(spacing:15){
                        
                        Image(systemName: "eye")
                        .foregroundColor(Color("Orange"))
                   
                        SecureField("Password", text: self.$pass)
                    }
                    Divider().background(Color.white.opacity(0.5))
                }
                    .padding(.horizontal)
                    .padding(.top, 30)
                    
                    // replacing forget password with reenter password...
                    // so same height will be maintained...
                    
                    VStack{
                         
                         HStack(spacing:15){
                             
                             Image(systemName: "eye")
                            .foregroundColor(Color("Orange"))
                        
                             SecureField("Password", text: self.$Repass)
                         }
                         Divider().background(Color.white.opacity(0.5))
                     }
                         .padding(.horizontal)
                         .padding(.top, 30)
                }
                .padding()
                // bottom padding...
                .padding(.bottom, 65)
                .background(Color("Blue"))
                .clipShape(CShape1())
                //clipping the content shape also for tap gesture...
                .contentShape(CShape1())
                // shadow...
                .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                .onTapGesture {
                    
                    self.index = 1
                    
                }
                .cornerRadius(35)
                .padding(.horizontal,20)
                
                *// Button...*
                
                Button(action: {
                    
                }) {
                    
                  Text("SIGNUP")
                    .foregroundColor(.white)
                    .fontWeight(.bold)
                    .padding(.vertical)
                    .padding(.horizontal, 50)
                    .background(Color("Blue"))
                    .clipShape(Capsule())
                    *// shadow ...*
                    .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                }
                *// moving view down...*
                    .offset(y: 25)
            *// hiding view when its in background...*
            *// only button...*
                    .opacity(self.index == 1 ? 1 : 0)

        }
    }
}

}
}

}

        
            

所以你的代碼中的問題是你在GeomtryReader中定義視圖,這是一個很大的不。 因此,解決方法是將LoginSingup移到GeomtryReader之外,或者更好的做法是為每個視圖創建一個新文件並將其代碼添加到該文件中。 例如,一個用於Login.swift的文件和另一個用於Register.swift的文件,也許另一個名為Shapes的文件包含多個形狀並導出它們。

你正在做的事情與此類似

struct ContentView: View {
    var body: some View {
          GeomtryReader { _ in
                Text("test")

                // Here is where the bug would happen
                struct NewView: View {
                      var body: some View {
                            Text("Second View")
                      } 
                }
                //////////////////////////////////////
          }
    }
}

你可以看看如果你復制並粘貼上面的代碼它會產生同樣的錯誤。 您應該做的是將GeomtryReader移到NewView之外

像這樣的東西

struct ContentView: View {
    var body: some View {
          return GeomtryReader { _ in
                Text("test")
          }
          
          // This will fix the error
          struct NewView: View {
                var body: some View {
                      Text("Second View")
                } 
          }
          //////////////////////////////////////
    }
}

注意我將代碼移到了哪里。 另請注意,我已將Return添加到GeomtryReader中,這是因為body是一個計算屬性,期望具有View的值,但在這種情況下,我們混淆了編譯器,我們希望哪個View成為返回值,所以我們有手動指定它。 如果您不想包含return ,那么您將不得不將NewView移到body之外,甚至更好地移到ContentView之外。

無論如何,這是您的代碼 100% 工作,您可以復制和粘貼它。

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        
        Home()
            // for light status bar...
            .preferredColorScheme(.dark)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Home : View {
    
    @State var index = 0
    
    var body: some View{
        
        return GeometryReader{ _ in // ( ERROR MESSAGE OCCURS HERE)--> ("Type '()' cannot conform to'View'; only struct/enum/class types can conform to protocols" and  "Required by generic struct 'GeometryReader' where 'Content' = '()'")
            
            VStack{
                
                Image("logo")
                    .resizable()
                    .frame(width:60, height: 60)
                
                ZStack{
                    
                    SignUp(index: self.$index)
                        // changing view order...*
                        .zIndex(Double(self.index))
                    
                    Login(index: self.$index)
                    
                    
                }
                
                HStack(spacing: 15){
                    
                    Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                    
                    Text("OR")
                    
                    Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                }
                .padding(.horizontal, 20)
                .padding(.top, 50)
                    // because login button is moved 25 in y axis and 25 padding = 50*
                    
                    
                    .background(Color("Orange").edgesIgnoringSafeArea(.all))
                
                
//                Curve...
                
                HStack(spacing: 25){
                    
                    Button(action: {
                        
                    }) {
                        Image("Unknown")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                    }
                    Button(action: {
                    }) {
                        
                        Image("fb")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                    }
                    
                    Button(action: {
                    }) {
                        
                        Image("instagram")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                        
                    }
                }
                .padding(.top, 30)
            }
            .padding(.vertical)
            
            
            
            
            
            
            
            
            
        }
        
        struct Login : View {
            
            @State var email = ""
            @State var pass = ""
            @Binding var index : Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            VStack(spacing:10){
                                
                                Text("Login")
                                    .foregroundColor(self.index == 0 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 0 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                            
                            Spacer(minLength:0)
                        }
                            .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                    .foregroundColor(Color("Blue"))
                                
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$pass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                        
                        HStack{
                            
                            Spacer(minLength: 0)
                            
                            Button(action: {
                                
                            }) {
                                
                                Text("Forget Password?")
                                    .foregroundColor(Color.white.opacity(0.6))
                            }
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                        // bottom padding...
                        .padding(.bottom, 65)
                        .background(Color("LightBlue"))
                        .clipShape(CShape())
                        .contentShape(CShape())
                        .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                        .onTapGesture{
                            
                            self.index = 0
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("LOGIN")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                            .background(Color("LightBlue"))
                            .clipShape(Capsule())
                            // shadow ...
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                        // moving view down...
                        .offset(y: 25)
                        .opacity(self.index == 0 ? 1 : 0)
                }
            }
        }
        
        //SignUp Page...

        struct SignUp : View {
            
            @State var email = ""
            @State var pass = ""
            @State var Repass = ""
            @Binding var index: Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            Spacer(minLength:0)
                            
                            VStack(spacing: 10){
                                
                                Text("SignUp")
                                    .foregroundColor(self.index == 1 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 1 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                        }
                            .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                    .foregroundColor(Color("Orange"))
                                
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$pass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                        
                        // replacing forget password with reenter password...
                        // so same height will be maintained...
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$Repass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                        // bottom padding...
                        .padding(.bottom, 65)
                        .background(Color("Blue"))
                        .clipShape(CShape1())
                        //clipping the content shape also for tap gesture...
                        .contentShape(CShape1())
                        // shadow...
                        .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                        .onTapGesture {
                            
                            self.index = 1
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...*
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("SIGNUP")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                            .background(Color("Blue"))
                            .clipShape(Capsule())
                            // shadow ...*
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                        // moving view down...*
                        .offset(y: 25)
                        // hiding view when its in background...*
                        // only button...*
                        .opacity(self.index == 1 ? 1 : 0)
                    
                }
            }
        }
        
        struct CShape: Shape {
            func path(in rect: CGRect) -> Path {
                
                return Path {path in
                    
                    //right side curve...*
                    
                    path.move(to: CGPoint(x: rect.width, y: 100))
                    path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                    path.addLine(to: CGPoint(x: 0, y: rect.height))
                    path.addLine(to: CGPoint(x: 0, y: 0))
                }
                
            }
        }

        struct CShape1: Shape {
            func path(in rect: CGRect) -> Path {
                
                return Path {path in
                    
                    //left side curve...*
                    
                    path.move(to: CGPoint(x: 0, y: 100))
                    path.addLine(to: CGPoint(x: 0, y: rect.height))
                    path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                    path.addLine(to: CGPoint(x: rect.width, y: 0))
                }
                
            }
        }
    }
    


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM