How to add non-async wrappers to Task extensions in Swift

I’m curious if anyone has run into this question before. I initially ran into problems when trying to create a non-async wrapper to the Task.sleep, then further digging has led me to this simpler discussion point.

This is valid Swift:

struct Foo {}

extension Foo {
    static func bar() async throws {
    }
    
    static func bar() {
        Task {
            try await bar()
        }
    }
}

But the following is not:

extension Task {
    static func bar() async throws {
    }
    
    static func bar() {
        Task {
            try await bar()
        }
    }
}

This gives me two errors (in Xcode 15.4):

  1. Referencing initializer 'init(priority:operation:)' on 'Task' requires the types 'Failure' and 'any Error' be equivalent

  2. 'Cannot convert value of type '()' to closure result type 'Success'.

The latter has a Fix-it that adds a as! Success at the end of the call to bar that fixes the second error.

Already, I’m a bit confused about why it was needed – Foo didn’t need such a cast! Presumably it was implicitly doing a cast, but why doesn’t it do it for the Task extension? Digging into it a bit (Cmd-clicking on Task) I see that Success and Failure are the placeholder types for the Task generic. But the bar function that I’m defining in my Task extension is not using those placeholder types. Yes, there’s a Task being used inside my bar function, but I’d have thought that was independent of the generic context for the static functions signature. So why does this cause an error?

But even setting that aside, using the Fix-it-suggested cast and plowing ahead anyway, we have the first error stopping us. I find I can get rid of the error by changing the extension declaration line to:

extension Task where Failure == Error {

But I don’t like that, either. First of all, it seems too specific (but perhaps it’s syntactic sugar really meaning Failure is any type that conforms to Error, I’m not sure), and secondly, it has the same problem where I feel the Task inside the implementation of bar should not have cared about the constraints on the extension.

Finally, getting back to my initial starting point, I try to use these iffy-feeling techniques to define a non-async sleep to Task, like so:

extension Task  where Failure == Error  {
    static func sleep(nanoseconds: UInt64) {
        Task {
            try await Task.sleep(nanoseconds: nanoseconds) as! Success
        }
    }
}

Now I get these warnings:

  1. No 'async' operations occur within 'await' expression
  2. No calls to throwing functions occur within 'try' expression

Which makes me think that the compiler is doing a recursion rather than calling the standard async version of sleep. Obviously that would be very bad and is not what I’m intending. How do I fix this?

I know I’m somewhat off the beaten path here, and I know there are many simpler ways of solving the problem of making a non-async wrapper to Task.sleep, but in the interest of deepening my understanding of Swift and related frameworks I’m asking if anyone has insight into this situation.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật