“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”

Posted

技术标签:

【中文标题】“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”【英文标题】:"Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols" 【发布时间】:2020-07-20 20:45:10 【问题描述】:

编辑:问题说明

此代码产生错误,发帖者不知道如何解决。

这是对上一篇文章的新编辑。

我在 >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)

        
    







        
            

【问题讨论】:

您能否修复您的代码以便我们运行它?你发布的内容到处都是。不过,您的问题似乎很容易解决。 如果我获取您的代码并修复格式,它似乎可以正常工作,因此您发布的内容是不可复制的。 我很抱歉难以阅读。我接受了你的更正,我希望这会更好。谢谢,穆汉德! 您好,悉尼,欢迎来到 SO!我已经测试了您的代码,但我不得不将 SignUpLogin 替换为 Text 组件,因为您没有在问题中包含它们的代码。测试为我运行,没有任何错误。您是否有可能发布SignUp()Login() 查看代码?如果是这样,我很乐意明天下班后回复您。 @Sydney 完全不用担心。我同意 Samuel-IH 所说的。我也做过同样的事情。我用 Text() 替换了注册和登录,它工作得很好。我怀疑您的问题存在于其他视图中,如果您一次评论一个并查看哪个产生了错误,然后将其发布在此处是视图的代码,将会很有帮助。 【参考方案1】:

所以你的代码中的问题是你在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")
                       
                
                //////////////////////////////////////
          
    

你可以看看如果你复制粘贴上面的代码会产生同样的错误。你应该做的是将NewView移出GeomtryReader

类似的东西

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))
                
                
            
        
    
    



【讨论】:

非常感谢您的帮助和详细的解释。我对编码非常陌生,您的回复使我对错误的理解更加清晰。我非常感谢您为帮助我所付出的时间。 @Sydney 很高兴我能提供帮助!不要犹豫再问!我们是来帮忙的。另外请考虑将答案标记为正确,以便其他人更容易找到答案

以上是关于“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”的主要内容,如果未能解决你的问题,请参考以下文章