“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”
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!我已经测试了您的代码,但我不得不将SignUp
和 Login
替换为 Text 组件,因为您没有在问题中包含它们的代码。测试为我运行,没有任何错误。您是否有可能发布SignUp()
和Login()
查看代码?如果是这样,我很乐意明天下班后回复您。
@Sydney 完全不用担心。我同意 Samuel-IH 所说的。我也做过同样的事情。我用 Text() 替换了注册和登录,它工作得很好。我怀疑您的问题存在于其他视图中,如果您一次评论一个并查看哪个产生了错误,然后将其发布在此处是视图的代码,将会很有帮助。
【参考方案1】:
所以你的代码中的问题是你在GeomtryReader
中定义视图,这是一个很大的禁忌。因此,解决方法是将Login
和Singup
移到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 很高兴我能提供帮助!不要犹豫再问!我们是来帮忙的。另外请考虑将答案标记为正确,以便其他人更容易找到答案以上是关于“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”的主要内容,如果未能解决你的问题,请参考以下文章