代码之家  ›  专栏  ›  技术社区  ›  cluster1

任务(小写)与任务(大写)

  •  1
  • cluster1  · 技术社区  · 6 月前

    有什么区别?

    task {
        // ... //
    }
                    
    Task {
        // ... //
    }
    

    我偶然发现了它。

    Task 当您想要创建异步任务时,它是正确的结构。但写作 task 不会导致语法错误。我知道SwiftUI任务修饰符。但是,在通用代码中编写的目的是什么?

    2 回复  |  直到 6 月前
        1
  •  2
  •   Sweeper    6 月前

    但是写“任务”不会导致语法错误。

    导致编译器错误。尝试用全局函数编写它。

    func f() {
        task { } // cannot find symbol 'task'
    }
    

    所以不, task { } 不能在“通用代码”中使用。


    如果在声明中使用它,则不会导致编译器错误 View 结构体,例如。

    struct ContentView: View {
        var body: some View {
            List {}.onAppear {
                task {  } // this compiles
            }
        }
    }
    

    在这种情况下 task 指的是 task 改性剂。这和 self.task { } 。这创建了一个 查看 这与 self ,但添加了该任务,但由于这是在 onAppear ,该视图立即被丢弃,任务不被执行。

    如果你把它放在 body 然而,

    struct ContentView: View {
        var body: some View {
            task {  }
        }
    }
    

    那么这将导致无限递归。计算 身体 属于 ContentView ,我们需要找到 身体 属于 self.task { } 要做到这一点,我们需要找到 身体 任务 改性剂。这涉及到寻找 身体 认为它正在修改,因此我们需要找到 身体 属于 自己 ( 内容视图 ),并且这种情况会无限持续,直到堆栈溢出。

        2
  •  1
  •   Joakim Danielson    6 月前

    你可以在其他代码中编写一个没有点的修饰符,但我不确定它是否能很好地工作。

    所以 task 您拥有的版本与修饰符版本相同,需要返回 View 这意味着你真的应该使用 Task 如果你在函数内部。请注意

    这是一个愚蠢的例子,其中一个函数在视图中声明,我们可以从中学习两件事:1) 任务 闭包永远不会执行,只打印“Hello”2)我们可以在这里添加其他修饰符,它们也没有用。

    func silly() {
        Task {
            try await Task.sleep(for: .seconds(1))
            print("Hello")
        }
    
    
        task {
            try? await Task.sleep(for: .seconds(1))
    
            print("Hello 2")
        }
    
        font(.largeTitle)
    
    }