Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 错误:转义闭包捕获变异';自我';参数_Swift_Swiftui_Closures_Self - Fatal编程技术网

Swift 错误:转义闭包捕获变异';自我';参数

Swift 错误:转义闭包捕获变异';自我';参数,swift,swiftui,closures,self,Swift,Swiftui,Closures,Self,我已经回顾了关于这个主题的其他问题(有很多),但是没有一个解决与@状态相关的错误。我认为这正是@State解决的问题 这是相关代码 struct ViewA: View { @State private var startAnimation = false let width: CGFloat let height: CGFloat init(width: CGFloat, height: CGFloat) { self.wi

我已经回顾了关于这个主题的其他问题(有很多),但是没有一个解决与
@状态相关的错误。我认为这正是
@State
解决的问题

这是相关代码

 struct ViewA: View {
    @State private var startAnimation = false
    
    let width: CGFloat
    let height: CGFloat
    
    init(width: CGFloat, height: CGFloat) {
        self.width = width
        self.height = height
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            
            startAnimation = true //<--- The error is on this line
        }
            
        
    }
    
    var body: some View {
        Circle()
            .frame(width: width, height: height)
            .scaleEffect(CGSize(width: startAnimation ? 5.0 : 1.0 , height: startAnimation ? 5.0 : 1.0))
    }
}
结构视图A:视图{ @国家私有变量startAnimation=false 让宽度:CGFloat 让高度:CGFloat 初始(宽度:CGFloat,高度:CGFloat){ self.width=宽度 自我高度=高度 DispatchQueue.main.asyncAfter(截止日期:.now()+1.0){
startAnimation=true/我认为这与@State属性无关,但与您正在使用@escaping闭包这一事实有关。如果您在闭包中使用self,则转义闭包可能会导致一个强引用循环。有关解释@escaping闭包的文章,请参阅

亲切问候,,
MacUserT

为什么不使用.onAppear()??
.onAppear(){DispatchQueue.main.asyncAfter(截止日期:.now()+1.0){self.startAnimation=true}}}
好的……现在为什么它在.onAppear()内部工作而不是在init()内部?init用于初始化变量,而不是在某些时间段更改变量值。正确,它用于初始化结构。每次需要重新绘制屏幕时,都会丢弃当前视图并创建一个新的结构,然后调用init来初始化自身。OnAppear应该被调用一次。也可能是更多延迟动画的快捷方式可以是:
withAnimation(animation.linear(持续时间:0.5)。delay(1)){startAnimation=true}