Swift 缺少参数'的参数;项目';随时待命
我正在创建一个带有Swift UI的新闻应用程序,我使用firebase。但我总是有同样的错误:“调用中缺少参数'item'的参数”。我使用firebase Firestore存储我的文章数据,这里称为“项目”。当我使用“(item.[…]??”)输入文本时,我遇到了问题。我不知道为什么Swift 缺少参数'的参数;项目';随时待命,swift,firebase,swiftui,Swift,Firebase,Swiftui,我正在创建一个带有Swift UI的新闻应用程序,我使用firebase。但我总是有同样的错误:“调用中缺少参数'item'的参数”。我使用firebase Firestore存储我的文章数据,这里称为“项目”。当我使用“(item.[…]??”)输入文本时,我遇到了问题。我不知道为什么 // This is my code where I don't have a problem import SwiftUI import Firebase import Ballcap struct Sw
// This is my code where I don't have a problem
import SwiftUI
import Firebase
import Ballcap
struct SwiftUIView: View {
@ObjectBinding var dataSource: ItemDatabase = ItemDatabase()
var item: Item
var body: some View {
VStack {
Text(item.categorie ?? "")
.font(.title)
.fontWeight(.bold)
.foregroundColor(.green)
List {
ForEach(self.dataSource.items.identified(by: \.id)) { item in
MediumArticleItem(item: item.data!)
}
}
}
}
struct MediumArticleItem : View {
var item: Item
var body: some View {
HStack {
Image("test")
.resizable()
.renderingMode(.original)
.aspectRatio(contentMode: .fill)
.frame(width: 120, height: 100)
.cornerRadius(5)
.shadow(radius: 3)
Spacer()
VStack(alignment: .leading, spacing: 5.0) {
Text(item.title ?? "")
.font(.headline)
.foregroundColor(.primary)
Text(item.body ?? "")
.font(.subheadline)
.foregroundColor(.secondary)
.multilineTextAlignment(.leading)
.lineLimit(4)
}
.frame(width: 200, height: 100)
Spacer()
}
.frame(width: 330)
}
}
}
// This is the end of my View File and where I have a problem:
#if DEBUG
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
if FirebaseApp.app() != nil {
FirebaseApp.configure()
}
return SwiftUIView()
// the problem is here...
}
}
#endif
// ...and it proposed me to fix it buy this :
#if DEBUG
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
if FirebaseApp.app() != nil {
FirebaseApp.configure()
}
return SwiftUIView(item: Item) // <- but now I have a new error and it's wrote : "Cannot convert value // of type 'Item.Type' to expected argument type 'Item' "
}
}
#endif
// I have two models files for the connection to Firestore :
// This one is my Item.swift
import SwiftUI
import Ballcap
import Firebase
struct Item: Modelable, Codable, Hashable {
var title: String?
var body: String?
var body2: String?
var body3: String?
var categorie: String?
var author: String?
}
// And this one is my ItemDataSource file :
import Ballcap
import Firebase
import SwiftUI
import Combine
class ItemDatabase: BindableObject {
var willChange = PassthroughSubject<Void, Never>()
var _dataSource: DataSource<Document<Item>>?
var items: [Document<Item>] = [] {
willSet { self.willChange.send() }
}
init() {
_dataSource = DataSource<Document<Item>>.Query(Document<Item>.collectionReference).dataSource()
.onCompleted({ [weak self] (_, items) in
self?.items = items
}).listen()
}
}
//这是我没有问题的代码
导入快捷键
进口火基
进口球帽
结构快捷视图:视图{
@ObjectBinding变量数据源:ItemDatabase=ItemDatabase()
var项目:项目
var body:一些观点{
VStack{
文本(item.categorie???)
.font(.title)
.fontWeight(.粗体)
.foregroundColor(.绿色)
名单{
ForEach(self.dataSource.items.identified(by:\.id)){item in
MediumArticleItem(项目:item.data!)
}
}
}
}
结构MediumArticleItem:视图{
var项目:项目
var body:一些观点{
HStack{
图像(“测试”)
.可调整大小()
.renderingMode(.original)
.aspectRatio(内容模式:.fill)
.框架(宽度:120,高度:100)
.转弯半径(5)
.阴影(半径:3)
垫片()
VStack(对齐:。前导,间距:5.0){
文本(item.title???)
.font(.headline)
.foregroundColor(.primary)
文本(item.body??“”)
.font(.subheadline)
.foregroundColor(.secondary)
.multilitextalignment(.leading)
.lineLimit(4)
}
.框架(宽:200,高:100)
垫片()
}
.框架(宽度:330)
}
}
}
//这是我的视图文件的结尾,我遇到了一个问题:
#如果调试
结构快捷视图\u预览:预览提供程序{
静态var预览:一些视图{
如果FirebaseApp.app()!=nil{
FirebaseApp.configure()
}
返回SwiftUIView()
//问题就在这里。。。
}
}
#恩迪夫
//…它建议我修复它买这个:
#如果调试
结构快捷视图\u预览:预览提供程序{
静态var预览:一些视图{
如果FirebaseApp.app()!=nil{
FirebaseApp.configure()
}
return SwiftUIView(item:item)/您的SwiftUIView
的属性定义为:
var项目:项目
这意味着,除非您为视图创建初始值设定项,否则编译器将为您合成一个初始值设定项。在本例中,类似于以下内容:
init(数据源:ItemDatabase=ItemDatabase(),item:item){
self.dataSource=数据源
self.item=项目
}
这就是为什么您必须创建视图,并将项作为参数传递
关于以下方面的错误:
SwiftUIView(item:item)//可以省略数据源,因为initilizer有一个默认值
Item
不是一个值,而是一个类型。假设您有一个需要整数的函数,而不是这样做:myfunc(value:3)
,而是这样做:myfunc(value:Int)
。这是编译器告诉您的,但类型是Item
,而不是Int
因此,您需要使用Item的初始值设定项创建一个Item类型的值:
SwiftUIView(项目:项目(标题:“abc”,…)//在此处使用正确的初始值设定项
我认为这是一个很好的答案,但是你能澄清一下你想用这行代码做什么吗返回SwiftUIView(项目:项目)
?你希望它做什么?谢谢你的回答,但它会打印我在其中输入的文本:SwiftUIView(项目:项目(标题:“abc”,…).我不知道如何更改它,因为我希望它打印我文章的类别名称,并在里面显示firebase@MathieuCloart这里不是一个经验丰富的iOS开发人员,但其想法是预览,即视图SwiftUIView\u预览在Live view中显示的内容,需要一些数据来填充SwiftUIView
。如果要用动态数据填充预览视图,则可以通过SwiftUIView(项:项(标题:“\(dynamicData)”,…)
将其输入预览。否则,预览将包含静态数据。