Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 未使用正确的值观察到已发布的var_Swift - Fatal编程技术网

Swift 未使用正确的值观察到已发布的var

Swift 未使用正确的值观察到已发布的var,swift,Swift,我有一个已发布的变量,可以在类中设置该变量,但在调用它的视图中不会读取该值 下面是课程: class Api: ObservableObject { @Published var showingAlert = false func getRunClub(url: String, completion : @escaping ([RunClubsv2])->()){ let session = URLSession(configuration: .defa

我有一个
已发布的
变量,可以在类中设置该变量,但在调用它的视图中不会读取该值

下面是课程:

    class Api: ObservableObject {
    @Published var showingAlert = false

    func getRunClub(url: String, completion : @escaping ([RunClubsv2])->()){

    let session = URLSession(configuration: .default)

    session.dataTask(with: URL(string: url)!) { (data, response, err) in

        if err != nil{

            print("Unable to get data \(err!.localizedDescription)")
            return
        }
        //decoding JSON

        do {
            self.showingAlert = true. <== Here's where I set it
            print("Class API set alert to: \(self.showingAlert)") <== I can see it being set to true here
            let runclubs = try JSONDecoder().decode([RunClubsv2].self, from: data!)
//            print(runclubs)
            //returning data
            completion(runclubs)

        }
        catch{
            print("Catching error \(error)")
        }
    }
.resume()
}

我真的不确定我做错了什么。

每次你说
Api()
,那是一个不同的Api对象。因此,当您说
Api().getRunClub
时,您正在调用的
getRunClub
的Api与您正在完成处理程序中检查的Api
self.foo
不同。这就好像你把一只狗涂成红色,然后转过身去,想知道为什么另一只狗不是红色的

还有,你说

print("Alert was set to: \(self.foo.showingAlert)")
if self.foo.showingAlert == true {
一切都错了。这个值不会改变。拥有一个可观察的物体的意义在于你观察它。你不是在观察它,你只是看了它一眼。所以当然,它永远不会改变

看起来您可能要做的是执行一些耗时的操作(如联网),在操作期间发出警报,然后在操作结束时再次降低警报。在这种情况下,你的结构是完全错误的。您需要使用与ObserveObject的
@Published
值的绑定来触发警报的存在或不存在。以下是所需结构的草图示例:

class-AlertShower:observateObject{
@已发布的var showAlert=false
func doYourThing(){
self.showart=true
//假设这是一个耗时的操作
DispatchQueue.main.asyncAfter(截止日期:.now()+2){
self.showart=false
}
}
}
结构ContentView:View{
@ObservedObject变量alertShower=alertShower()
var body:一些观点{
按钮(“点击我”){
self.alertShower.doYourThing()
}.fullScreenCover(显示:self.$alertShower.showAlert,内容:{
文本(“我是警报”)
})
}
}

如果您只是运行该代码,您将看到当您点击按钮时,“警报”会出现一段时间,然后消失。这似乎就是你所追求的那种东西(尽管很难说)。

每次你说
Api()
,那是一个不同的Api对象。因此,当您说
Api().getRunClub
时,您正在调用的
getRunClub
的Api与您正在完成处理程序中检查的Api
self.foo
不同。这就好像你把一只狗涂成红色,然后转过身去,想知道为什么另一只狗不是红色的

还有,你说

print("Alert was set to: \(self.foo.showingAlert)")
if self.foo.showingAlert == true {
一切都错了。这个值不会改变。拥有一个可观察的物体的意义在于你观察它。你不是在观察它,你只是看了它一眼。所以当然,它永远不会改变

看起来您可能要做的是执行一些耗时的操作(如联网),在操作期间发出警报,然后在操作结束时再次降低警报。在这种情况下,你的结构是完全错误的。您需要使用与ObserveObject的
@Published
值的绑定来触发警报的存在或不存在。以下是所需结构的草图示例:

class-AlertShower:observateObject{
@已发布的var showAlert=false
func doYourThing(){
self.showart=true
//假设这是一个耗时的操作
DispatchQueue.main.asyncAfter(截止日期:.now()+2){
self.showart=false
}
}
}
结构ContentView:View{
@ObservedObject变量alertShower=alertShower()
var body:一些观点{
按钮(“点击我”){
self.alertShower.doYourThing()
}.fullScreenCover(显示:self.$alertShower.showAlert,内容:{
文本(“我是警报”)
})
}
}

如果您只是运行该代码,您将看到当您点击按钮时,“警报”会出现一段时间,然后消失。这似乎是你所追求的那种东西(尽管很难说)。

这更有意义。为什么当我删除
self
时会出现以下错误-在闭包中引用属性“foo”需要显式的“self”。以使捕获语义显式。是因为我在
列表中吗
?我尝试调用
Api()。showingAlert
查看我会有一个不同的值,但它仍然设置为
false
是的,这是另一个Api对象。太好了,现在你有三条狗,其中两只不是红色的。眼卷。请重读我的第一句话:每次你说
Api()
,那是一个不同的Api对象。千方百计。至于另一个错误,那完全是另一回事;把它吸起来,说“我自己”。我不要三条狗,我只要一条狗。我没听懂你说的话。我不介意吸吮它并使用
self.
,但是
self.foo
刚刚返回了上面设置的
Api
。你能告诉我需要做什么才能得到发布的var的值吗?“但是,
self.foo
刚刚返回了上面设置的Api”,这不正是你想要的吗?你想一直和self.foo
。那是你唯一的狗不过,老实说,如果您要主动获取
self.foo.showingAlert
的值,那么我看不出发布
@或将其作为可观察对象有什么意义。您甚至没有解释showingAlert的作用。如果它应该做一个警报显示,那么在
If
语句中查看
self.foo.showinglert
并不是你应该做的。这更有意义。为什么当我删除
self
时会出现以下错误-在闭包中引用属性“foo”需要显式的“self”。以使捕获语义显式。是