【问题标题】:Missing argument for parameter 'item' in call调用中缺少参数“项目”的参数
【发布时间】:2019-07-27 17:11:49
【问题描述】:

我正在使用 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 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()
    }
}

我不想再有错误,我想知道为什么会出现这个错误。

【问题讨论】:

  • 我认为有一个很好的答案,但你能澄清一下你想用这行代码return SwiftUIView(item: Item)做什么吗?你希望它做什么?

标签: swift firebase swiftui


【解决方案1】:

您的SwiftUIView 有一个属性定义为:

var item: Item

这意味着除非您为视图创建初始化程序,否则编译器将为您合成一个。在这种情况下,接近于这个:

init(dataSource: ItemDatabase = ItemDatabase(), item: Item) {
  self.dataSource = dataSource
  self.item = item
}

这就是为什么您必须创建视图,将项目作为参数传递。

至于错误:

SwiftUIView(item: Item) // dataSource can be omitted, because the initilizer has a default value

Item 不是一个值,而是一个类型。想象一下,您有一个需要整数的函数,而不是这样做:myfunc(value: 3),而是这样做:myfunc(value: Int)。这是编译器告诉你的,但是类型是Item,而不是Int

所以你需要创建一个 Item 类型的值,使用它的初始化器:

SwiftUIView(item: Item(title: "abc", ....)) // use the right initializer here

【讨论】:

  • 感谢您的回答,但它会打印我在其中输入的文本:SwiftUIView(item: Item(title: "abc", ....))。而且我不知道如何更改它,因为我希望它打印我的文章的类别名称并在 firebase 中显示
  • @MathieuCloart 这里不是经验丰富的 iOS 开发人员,但想法是预览,即 SwiftUIView_Previews 在实时视图中呈现的视图,需要一些数据来填充 SwiftUIView。如果您有动态数据来填充预览视图,那么您可以通过SwiftUIView(item: Item(title: "\(dynamicData)", ...)) 将其输入预览。否则,预览将包含您的静态数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多