the error:
Converting non-sendable function value to '@MainActor @Sendable () -> String' may introduce data races
on the line
self._fetch = fetcher.fetch
It works if I make DataFetcher Sendable, or if I store the DataFetcher object directly (as in AnyDataFetcherSolution2)
Any other solutions?
I do not see the difference between AnyDataFetcherSolution2 and AnyDataFetcher. If AnyDataFetcher may have race condition, so is AnyDataFetcherSolution2.
// Define a protocol for the result type
protocol DataFetcher {
@MainActor
func fetch() -> String
}
// A type-erased wrapper
struct AnyDataFetcher: DataFetcher {
private let _fetch: @MainActor () -> String
init<T: DataFetcher>(_ fetcher: T) {
self._fetch = fetcher.fetch
}
func fetch() -> String {
return _fetch()
}
}
// This works
struct AnyDataFetcherSolution2: DataFetcher {
private let anyDataFetcher: any DataFetcher
init<T: DataFetcher>(_ fetcher: T) {
self.anyDataFetcher = fetcher
}
func fetch() -> String {
return self.anyDataFetcher.fetch()
}
}