SwiftUI使用网页链接时出现'No arguments'参数错误求助
报错根因
你为ContactsDetailView实现了无入参的自定义init()方法,覆盖了Swift结构体默认自动生成的成员构造器。此时该View的构造器不接收任何参数,预览代码中调用ContactsDetailView(contact: contacts[0])传入参数时,就会触发Argument passed to call that takes no arguments报错。
当前的无参构造器还存在两个问题:
- 没有初始化结构体的存储属性
contact,Swift要求所有存储属性必须在构造阶段完成赋值 - 单独定义
websitetext属性存储contact.website属于冗余逻辑,无实际必要
解决方案
方案1(推荐):删除冗余代码,使用默认生成的构造器
不需要自定义构造器、也不需要单独定义websitetext属性,直接删除这部分冗余代码,Swift会自动生成接收contact参数的成员构造器,修改后的核心代码如下:
struct ContactsDetailView: View{ let contact: Contact // 删除自定义init和多余的websitetext属性 var body: some View { HStack{ VStack { Image(contact.imageName) .resizable() .aspectRatio(contentMode: .fill) .frame(width: 100, height: 100) .clipped() .cornerRadius(50) Text(contact.name) .font(.system(size: 21, weight:.medium, design: .default)) Form{ HStack { Text("Phone") Spacer() Text(contact.phone) .foregroundColor(.gray) .font(.callout) } Section{ // 直接读取contact.website即可 Link("Website", destination: URL(string: contact.website)!) } } } } } } struct ResourcesDetailView_Previews: PreviewProvider { static var previews: some View { ContactsDetailView(contact: contacts[0]) // 此时调用正常,无报错 } }
方案2:保留自定义构造器时的正确写法
如果后续有逻辑必须在构造方法中处理,需要为自定义init明确声明入参,并且在构造方法中初始化所有存储属性:
struct ContactsDetailView: View{ let contact: Contact let websitetext: String // 自定义构造器明确声明接收contact参数 init(contact: Contact) { self.contact = contact // 必须完成contact属性的初始化 self.websitetext = contact.website } // 其余body逻辑保持不变即可 }
内容的提问来源于stack exchange,提问作者Skyrifter
相关产品推荐
相关产品推荐

