“weak” 只能应用于类和类绑定协议类型,而不能应用于“ContentView”,我缺少什么?

3
我试图运行这段代码,但在闭包中出现了警告...有什么方法可以解决吗? 为了在后台线程中运行过滤器函数,建议我使用带有过滤器函数的 init 函数。 但是在闭包中出现了以下警告: "'weak' 只能应用于类和类约束协议类型,而不能应用于 'ContentView'。"
import SwiftUI

struct ContentView: View {
    @ObservedObject var dm: DataManager
    @State private var searchTerm : String = ""
    @State var filteredAirports: [AirportModel] = []
    init(dataM: DataManager) {
        self.dm = dataM
        dm.filter(valoreSearhed: searchTerm, arrayTosearh: dm.airportVector, closure: { [weak self] in
            self?.filteredAirports = $0 })
    }
    var body: some View {
        VStack {
            SearchBar(text: $searchTerm)

            List {
                ForEach(filteredAirports) { valore in
                    Text(valore.aptICAO)
                }
            }
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(dataM: DataManager())
    }
}
2个回答

5

weak 是用于引用类型的修饰符(例如:弱引用、在所有引用被释放时为可空)。但是你的 ContentView 是一个值类型的 struct


2

删除[weak self],因为它用于类等引用类型,而ContentView是值类型struct


明白了,问题在于如果我将其移除,会得到警告“逃逸闭包捕获可变的 'self' 参数”。 - Damiano Miazzi
1
@DamianoMiazzi 正确;您不能以这种方式改变结构体。不太清楚您想要做什么,但您可能想在此处使用绑定而不是回调。视图只是描述事物的数据。请参见https://stackoverflow.com/questions/59510620/why-cant-i-mutate-a-variable-initially-set-to-a-certain-parameter-when-the-func/59511421#59511421 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接