Discuss Swift.

Swift Documentation

Posts under Swift subtopic

Post

Replies

Boosts

Views

Activity

TaskExecutor and Swift 6 question
I have the following TaskExecutor code in Swift 6 and is getting the following error: //Error Passing closure as a sending parameter risks causing data races between main actor-isolated code and concurrent execution of the closure. May I know what is the best way to approach this? This is the default code generated by Xcode when creating a Vision Pro App using Metal as the Immersive Renderer. Renderer @MainActor static func startRenderLoop(_ layerRenderer: LayerRenderer, appModel: AppModel) { Task(executorPreference: RendererTaskExecutor.shared) { //Error let renderer = Renderer(layerRenderer, appModel: appModel) await renderer.startARSession() await renderer.renderLoop() } } final class RendererTaskExecutor: TaskExecutor { private let queue = DispatchQueue(label: "RenderThreadQueue", qos: .userInteractive) func enqueue(_ job: UnownedJob) { queue.async { job.runSynchronously(on: self.asUnownedSerialExecutor()) } } func asUnownedSerialExecutor() -> UnownedTaskExecutor { return UnownedTaskExecutor(ordinary: self) } static let shared: RendererTaskExecutor = RendererTaskExecutor() }
1
0
834
Dec ’24
HealthKit permissions not honoring user selection
I'm dealing with a strange bug where I am requesting read access for 'appleExerciseTime' and 'activitySummaryType', and despite enabling both in the permission sheet, they are being set to 'sharingDenied'. I'm writing a Swift Test for making sure permissions are being granted. @Test func PermissionsGranted() { try await self.manager.getPermissions() for type in await manager.allHealthTypes { let status = await manager.healthStore.authorizationStatus(for: type) #expect(status == .sharingAuthorized, "\(type) authorization status is \(status)") } } let healthTypesToShare: Set<HKSampleType> = [ HKQuantityType(.bodyMass), HKQuantityType(.bodyFatPercentage), HKQuantityType(.leanBodyMass), HKQuantityType(.activeEnergyBurned), HKQuantityType(.basalEnergyBurned), HKObjectType.workoutType() ] let allHealthTypes: Set<HKObjectType> = [ HKQuantityType(.bodyMass), HKQuantityType(.bodyFatPercentage), HKQuantityType(.leanBodyMass), HKQuantityType(.activeEnergyBurned), HKQuantityType(.basalEnergyBurned), HKQuantityType(.appleExerciseTime), HKObjectType.activitySummaryType() ] let healthStore = HKHealthStore() func getPermissions() async throws { try await healthStore.requestAuthorization(toShare: self.healthTypesToShare, read: self.allHealthTypes) } After 'getPermissions' runs, the permission sheet shows up on the Simulator, and I accept all. I've double checked that the failing permissions show up on the sheet and are enabled. Then the test fails with: Expectation failed: (status → HKAuthorizationStatus(rawValue: 1)) == (.sharingAuthorized → HKAuthorizationStatus(rawValue: 2)) HKActivitySummaryTypeIdentifier authorization status is HKAuthorizationStatus(rawValue: 1) Expectation failed: (status → HKAuthorizationStatus(rawValue: 1)) == (.sharingAuthorized → HKAuthorizationStatus(rawValue: 2)) HKActivitySummaryTypeIdentifier authorization status is HKAuthorizationStatus(rawValue: 1) With the rawValue of '1' being 'sharingDenied'. All other permissions are granted. Is there a workaround here, or something I'm potentially doing wrong?
1
0
962
Jan ’25
Error `Type of expression is ambiguous without a type annotation` when trying to create a Task.
Hi, I've got this view model that will do a search using a database of keywords. It worked fine when the SearchEngine wasn't an actor but a regular class and the SearchResult wasn't a Sendable. But when I changed them, it returned Type of expression is ambiguous without a type annotation error at line 21 ( searchTask = Task {). What did I do wrong here? Thanks. protocol SearchableEngine: Actor { func searchOrSuggest(from query: String) -> SearchResult? func setValidTitles(_ validTitles: [String]) } @MainActor final class SearchViewModel: ObservableObject { @Published var showSuggestion: Bool = false @Published var searchedTitles: [String] = [] @Published var suggestedKeyword: String? = nil private var searchTask: Task<Void, Never>? private let searchEngine: SearchableEngine init(searchEngine: SearchableEngine) { self.searchEngine = searchEngine } func search(_ text: String) { searchTask?.cancel() searchTask = Task { guard !Task.isCancelled else { return } let searchResult = await searchEngine.searchOrSuggest(from: text) ?? .notFound guard !Task.isCancelled else { return } await MainActor.run { switch searchResult { case let .searchItems(_, items): showSuggestion = false searchedTitles = items.map(\.title) suggestedKeyword = nil case let .suggestion(keyword, _, items): showSuggestion = true searchedTitles = items.map(\.title) suggestedKeyword = keyword case .notFound: showSuggestion = false searchedTitles = [] suggestedKeyword = nil } } } } }
1
0
519
Oct ’25
Crash when Mutating Array of Tuples with String Property from Multiple Threads
Hi Apple Developer Community, I'm facing a crash when updating an array of tuples from both a background thread and the main thread simultaneously. Here's a simplified version of the code in a macOS app using AppKit: class ViewController: NSViewController { var mainthreadButton = NSButton(title: "test", target: self, action: nil) var numbers = Array(repeating: (dim: Int, key: String)(0, "default"), count: 1000) override func viewDidLoad() { super.viewDidLoad() view.addSubview(mainthreadButton) mainthreadButton.translatesAutoresizingMaskIntoConstraints = false mainthreadButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true mainthreadButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true mainthreadButton.widthAnchor.constraint(equalToConstant: 100).isActive = true mainthreadButton.heightAnchor.constraint(equalToConstant: 100).isActive = true mainthreadButton.target = self mainthreadButton.action = #selector(arraytest(_:)) } @objc func arraytest(_ sender: NSButton) { print("array update started") // Background update DispatchQueue.global().async { for i in 0..&lt;1000 { self.numbers[i].dim = i } } // Main thread update var sum = 0 for i in 0..&lt;1000 { numbers[i].dim = i + 1 sum += numbers[i].dim print("test \(sum)") } mainthreadButton.title = "test = \(sum)" } } This results in a crash with the following message: malloc: double free for ptr 0x136040c00 malloc: *** set a breakpoint in malloc_error_break to debug What's interesting: This crash only happens when the tuple contains a String ((dim: Int, key: String)) If I change the tuple type to use two Int values ((dim: Int, key: Int)), the crash does not occur My Questions: Why does mutating an array of tuples containing a String crash when accessed from multiple threads? Why is the crash avoided when the tuple contains only primitive types like Int? Is there an underlying memory management issue with value types containing reference types like String? Any explanation about this behavior and best practices for thread-safe mutation of such arrays would be much appreciated. Thanks in advance!
1
0
110
Apr ’25
Strange values written in loop
I don't understand what's happening when I save values via a loop. I initialize an array with default values, then run a loop to assign calculated values to it. In the middle of the loop, I print values, then print values again after the loop is over. The array values sometimes change, even though nothing has been written between print calls (when they change, the values are equal the last value in the array, index 49). I made a test file which writes four types of values to an array: (1) A new class instance, (2) Calculation, (3) Variable, (4) Hard-code. Saving the same value gives different results between the different write methods: import Foundation let numElements : Int = 50 class CustomType{ var x : Double var y : Double init(x: Double = 1.23, y: Double = 2.34) { self.x = x self.y = y } } // Try this four different ways var array1 = [CustomType](repeating:CustomType(), count:numElements) var array2 = [CustomType](repeating:CustomType(), count:numElements) var array3 = [CustomType](repeating:CustomType(), count:numElements) var array4 = [CustomType](repeating:CustomType(), count:numElements) // Checking that defaults were written print("Pre: Point 1: (\(array1[44].x),\(array1[44].y))") print("Pre: Point 2: (\(array2[44].x),\(array2[44].y))") print("Pre: Point 3: (\(array3[44].x),\(array3[44].y))") print("Pre: Point 4: (\(array4[44].x),\(array4[44].y))") // --- Fix 1: Problem goes away if I uncomment this: // array1[44]=CustomType() // array2[44]=CustomType() // array3[44]=CustomType() // array4[44]=CustomType() // --- Fix 2: Or if you swap these two lines for the following line: // let index = 44 // do { for index in 0..<numElements{ let rads = Double(index) * 2 * Double.pi/Double(numElements) let sinrads = sin(rads), cosrads = cos(rads) // Four different ways to save to arrays array1[index] = CustomType(x:sin(rads),y:cos(rads)) array2[index].x = sin(rads) array2[index].y = cos(rads) array3[index].x = sinrads array3[index].y = cosrads array4[index].x = -0.684547105928689 array4[index].y = 0.7289686274214113 if(index==44){ print("\n== Printing results mid-loop at index 44 ==") print("During: index: \(index), Calculated Rads: \(rads)") print("During: Calculated Vals: (\(sin(rads)),\(cos(rads)))") print("During: Stored 'let' Vals: (\(sinrads),\(cosrads))") print("During: Point 1: (\(array1[44].x),\(array1[44].y))") print("During: Point 2: (\(array2[44].x),\(array2[44].y))") print("During: Point 3: (\(array3[44].x),\(array3[44].y))") print("During: Point 4: (\(array4[44].x),\(array4[44].y))") } } print("\n== Printing the same results after the loop ==") print("Post: Point 1: (\(array1[44].x),\(array1[44].y))") print("Post: Point 2: (\(array2[44].x),\(array2[44].y))") print("Post: Point 3: (\(array3[44].x),\(array3[44].y))") print("Post: Point 4: (\(array4[44].x),\(array4[44].y))") print("\n== Reverse-calculating results from a correct array (array 1) to get the for loop index ==") print("reverse index calculation 01: \( (atan2(array1[ 1].x,array1[ 1].y) + Double.pi * 0) * Double(numElements)/(2*Double.pi) )") print("reverse index calculation 44: \( (atan2(array1[44].x,array1[44].y) + Double.pi * 2) * Double(numElements)/(2*Double.pi) )") print("reverse index calculation 45: \( (atan2(array1[45].x,array1[45].y) + Double.pi * 2) * Double(numElements)/(2*Double.pi) )") print("\n== Reverse-calculating results from an incorrect array (array 2) to get the for loop index ==") print("reverse index calculation 1: \( (atan2(array2[ 1].x,array2[ 1].y) + Double.pi * 2) * Double(numElements)/(2*Double.pi) )") print("reverse index calculation 44: \( (atan2(array2[44].x,array2[44].y) + Double.pi * 2) * Double(numElements)/(2*Double.pi) )") print("reverse index calculation 45: \( (atan2(array2[45].x,array2[45].y) + Double.pi * 2) * Double(numElements)/(2*Double.pi) )") Which gives the following output: Pre: Point 1: (1.23,2.34) Pre: Point 2: (1.23,2.34) Pre: Point 3: (1.23,2.34) Pre: Point 4: (1.23,2.34) == Printing results mid-loop at index 44 == During: index: 44, Calculated Rads: 5.529203070318036 During: Calculated Vals: (-0.684547105928689,0.7289686274214113) During: Stored 'let' Vals: (-0.684547105928689,0.7289686274214113) During: Point 1: (-0.684547105928689,0.7289686274214113) During: Point 2: (-0.684547105928689,0.7289686274214113) During: Point 3: (-0.684547105928689,0.7289686274214113) During: Point 4: (-0.684547105928689,0.7289686274214113) == Printing the same results after the loop == Post: Point 1: (-0.684547105928689,0.7289686274214113) Post: Point 2: (-0.12533323356430465,0.9921147013144778) Post: Point 3: (-0.12533323356430465,0.9921147013144778) Post: Point 4: (-0.684547105928689,0.7289686274214113) == Reverse-calculating results from a correct array (array 1) to get the for loop index == reverse index calculation 01: 1.0000000000000002 reverse index calculation 44: 43.99999999999999 reverse index calculation 45: 45.0 == Reverse-calculating results from an incorrect array (array 2) to get the for loop index == reverse index calculation 1: 49.0 reverse index calculation 44: 49.0 reverse index calculation 45: 49.0 Program ended with exit code: 0 Re-initializing the objects prior to the loop fixes the problem (see "Fix 1" in the comments), but the elements of the array are all initialized during creation and I don't understand why doing it a second time is helpful. The values should all be the same, am I missing something simple?
2
0
512
Dec ’24
cell.textLabel?.text breaking if a number value is in an array
Hi the below array and code to output a list item works fine: var quotes = [ [ "quote": "I live you the more ...", "order": "1" ], [ "quote": "There is nothing permanent ...", "order": "2" ], [ "quote": "You cannot shake hands ...", "order": "3" ], [ "quote": "Lord, make me an instrument...", "order": "4" ] ] cell.textLabel?.text = quotes[indexPath.row]["quote"] However if I change the "order" values to be numbers rather than text like below then for the above line I get an error message in Xcode "No exact matches in call to subscript". Please could someone tell me how to make it work with the numbers stored as numbers? (I'm wondering if creating an any array type and using the .text function has caused a conflict but I can't find how to resolve) [ "quote": "I live you the more ...", "order": 1 ], [ "quote": "There is nothing permanent ...", "order": 2 ], [ "quote": "You cannot shake hands ...", "order": 3 ], [ "quote": "Lord, make me an instrument...", "order": 4 ] ] Thank you for any pointers :-)
2
0
437
Feb ’25
Compiler - method linking issue.
Issue: During app execution, the intended method is not being called; instead, the method preceding (written above the intended method) is being executed. For Example: //In my case the ViewController class is at 3rd level of inheritance. class ViewController: UIViewController { func methodA() { print("methodA") } func methodB() { print("methodB") } } let vc = ViewController() vc.methodB() Output: //"methodA" Expected: //"methodB" Observations: Recent code changes have revealed that enabling the below Swift-6 flag leads to this linking issue. When this flag is commented out, the problem disappears. .enableUpcomingFeature("InternalImportsByDefault") Additionally, moving the intended method into an extension of the same class resolves the issue when the flag is enabled. Conclusion: To resolve the issue: Comment out the Swift-6 flag. Alternatively, move the method into an extension of the same class, which addresses the issue for this specific case. I had similar issue in other class where it crashes with message "method not found", but actually the method is there. When moving the method into an extension of same class resolve this issue. Any help is much appreciated. Thanking you..
2
0
84
May ’25
Calling StoreKit Swift from C++
What is the most obvious method of calling StoreKit from C++. I'm getting blocked by the fact that most of the critical StoreKit calls are async and functions marked a sync don't show up in the swift header for me to call from C++ (at least as far as I can tell). I'm trying to call let result = try await Product.products(for:productIDs) or let result = try await product.purchase() And C++ can't even see any functions I wrap these in as far as I can tell because i have to make them async. What am I missing? I tried a lot of alternates, like wrapping in Task { let result = try await Product.products(for:productIDs) } and it gives me 'Passing closure as a sending parameter' errors. Also when I try to call the same above code it gives me 'initializtion of immutable value never used' errors and the variables never appear. Code: struct storeChooser { public var productIDs: [String] public function checkProduct1 { Task { let result = try await Product.products(for: productIDs) } The above gives the initialization of immutable value skipped, and when I create a @State var products Then I get the 'passing closure as a sending parameter' error when i try to run it in a task it appears if I could make the function async and call it from C++ and have it return nothing it may work, does anyone know how to get C++ to see an async function in the -Swift.h file?
2
0
132
May ’25
Swift / C++ Interop with Storekit - actor isolated structure cannot be exported to C++
I can't find a viable path to call StoreKit from C++ right now and would love some ideas. I'm implementing the code exactly as shown at 4:09 in https://developer.apple.com/videos/play/wwdc2023/10172/ However when I add any StoreKit functionality in I immediately get "Actor isolated structure cannot be exposed in C++" This makes me think I can't create a StoreKit view and call it from C++? Am I missing a better way? I don't think I can have another structure that holds the storeChooser in it because it will have the same problem (I assume, although I will check). Part of the issue seems to be that my app is C++ so there is no main function called in the swift for me to open this view with either, I was going to use the present function Zoe described (as below). I've tried a lot of alternative approaches but it seems to be blocking async functions from showing in C++ as well. So I'm not sure how to access the basic product(for:) and purchase(product) functions. import Foundation import StoreKit import SwiftUI public struct storeChooser: View { public var productIDs: [String] public var fetchError: String //@State //Note this is from the UI @State public var products: [Product] = [] // @State private var isPresented = true // weak private var host: UIViewController? = nil public init() { productIDs = ["20_super_crystals_v1"] products = [] self.fetchError = "untried" } public var body: some View { VStack(spacing: 20) { Text( "Products") ForEach(self.products) { product in Button { //dont do anything yet } label: { Text("\(product.displayPrice) - \(product.displayName)") } } }.task { do { try await self.loadProducts() } catch { print(error) } } } public func queryProducts() { Task { do { try await self.loadProducts() } catch { print(error) } } } public func getProduct1Name() -> String { if self.products.count > 0 { return self.products[0].displayName } else { return "empty" } } private func loadProducts() async throws { self.products = try await Product.products(for: self.productIDs) } /* public mutating func present(_ viewController: UIViewController) { isPresented = true; let host = UIHostingController(rootView: self) host.rootView.host = host viewController.present(host, animated: true) } */ }
2
0
108
May ’25
"_swift_coroFrameAlloc", 报错
Undefined symbols for architecture arm64: "_swift_coroFrameAlloc", referenced from: NvMobileCore.Constraint.isActive.modify : Swift.Bool in NvMobileCore[5] NvMobileCore.Constraint.isActive.modify : Swift.Bool in NvMobileCore[5] NvMobileCore.NvMobileCoreManager.delegate.modify : NvMobileCore.NvPublicInterface? in NvMobileCore[53] NvMobileCore.NvMobileCoreManager.delegate.modify : NvMobileCore.NvPublicInterface? in NvMobileCore[53] NvMobileCore.NvMobileCoreManager.language.modify : Swift.String in NvMobileCore[53] NvMobileCore.NvMobileCoreManager.language.modify : Swift.String in NvMobileCore[53] ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
2
0
214
3w
Best practice: Use of enum without cases for static helper functions?
Hi all, In Swift, I often see static helper functions grouped in an enum without any cases, like this: enum StringUtils { static func camelCaseToSnakeCase(_ input: String) -> String { // implementation } } Since this enum has no cases, it cannot be instantiated – which is exactly the point. It’s meant to group related functionality without any stored state, and without the need for instantiation. This pattern avoids writing a struct with a private init() and makes the intent clearer: "This is just a static utility, not an object." You’ll often see this used for things like: AnalyticsEvents.track(_:) My question: Is this use of a case-less enum considered good practice in Swift when building static-only helpers? Or is there a better alternative for expressing intent and preventing instantiation? I’d appreciate any insight – especially if there’s official guidance or references from the Swift core team. Thanks!
2
0
178
May ’25
Can I use @_implementationOnly import in my Framework
We have FrameworkA which needs to use another FrameworkB internally to fetch a token. Now when I try to use this FrameworkA, we are seeing an issue with internal framework i.e. No such module 'FrameworkB'. But when I use @_implementationOnly import for the internal FrameworkB, I didn't see any issues. So just wanted to check If I can go ahead and use this @_implementationOnly import flag in Production?
2
0
110
May ’25
Swift 6 concurrency. Apple Watch App target and -disable-dynamic-actor-isolation.
I've got a watch app, still with storyboard, WKInterfaceController and WatchConnectivity. After updating it for swift 6 concurrency I thought I'd keep it for a little while without swift 6 concurrency dynamic runtime check. So I added -disable-dynamic-actor-isolation in OTHER_SWIFT_FLAGS, but it doesn't seem to have an effect for the Apple Watch target. Without manually marking callbacks where needed with @Sendable in dynamic checks seem to be in place. swiftc invocation is as (includes -disable-dynamic-actor-isolation): swiftc -module-name GeoCameraWatchApp -Onone -enforce-exclusivity\=checked ... GeoCameraWatchApp.SwiftFileList -DDEBUG -enable-bridging-pch -disable-dynamic-actor-isolation -D DEBUG -enable-experimental-feature DebugDescriptionMacro -sdk /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS11.2.sdk -target arm64_32-apple-watchos7.0 -g -module-cache-path /Users/stand/Library/Developer/Xcode/DerivedData/ModuleCache.noindex -Xfrontend -serialize-debugging-options -enable-testing -index-store-path /Users/stand/Library/Developer/Xcode/DerivedData/speedo-almhjmryctkitceaufvkvhkkfvdw/Index.noindex/DataStore -enable-experimental-feature OpaqueTypeErasure -Xcc -D_LIBCPP_HARDENING_MODE\=_LIBCPP_HARDENING_MODE_DEBUG -swift-version 6 ... -disable-dynamic-actor-isolation flag seems to be working for the iOS targets, I believe. The flag is described here Am I missing something? Should the flag work for both iOS and Apple Watch targets?
2
0
617
Jan ’25
Trailing closure bug?
i am trying to build my code and have ran into this error. "Trailing closure passed to parameter of type 'DispatchWorkItem' that does not accept a closure" i have been trying to figure it out for so long, and even ai cant figure it out. is this a bug, or am i missing some obvious way to fix this ? func loadUser(uid: String, completion: (() -&gt; Void)? = nil) { db.collection("users").document(uid).getDocument { [weak self] snapshot, error in guard let data = snapshot?.data(), error == nil else { completion?(); return } DispatchQueue.main.async { self?.currentUser = User( username: data["username"] as? String ?? "Learner", email: data["email"] as? String ?? "", profileImageName: "person.circle.fill", totalXP: data["totalXP"] as? Int ?? 0, currentStreak: data["currentStreak"] as? Int ?? 0, longestStreak: data["longestStreak"] as? Int ?? 0, level: data["level"] as? Int ?? 1, levelProgress: data["levelProgress"] as? Double ?? 0.0, xpToNextLevel: data["xpToNextLevel"] as? Int ?? 100, completedLessons: data["completedLessons"] as? [String] ?? [] ) self?.saveUser() completion?() } } }
2
0
168
Jun ’25
Understanding an assertion failure in a crash log
Last night my iPhone game crashed while running in debug mode on my iPhone. I just plugged it into my Mac, and was able to find the ips file. The stack trace shows the function in my app where it crashed, and then a couple of frames in libswiftCore.dylib before an assertion failure. My question is - I've got absolutely no idea what the assertion failure actually was, all I have is... 0 libswiftCore.dylib 0x1921412a0 closure #1 in closure #1 in closure #1 in _assertionFailure(_:_:file:line:flags:) + 228 1 libswiftCore.dylib 0x192141178 closure #1 in closure #1 in _assertionFailure(_:_:file:line:flags:) + 327 2 libswiftCore.dylib 0x192140b4c _assertionFailure(_:_:file:line:flags:) + 183 3 MyGame.debug.dylib 0x104e52818 SentryBrain.takeTurn(actor:) + 1240 ... How do I figure out what the assertion failure was that triggered the crash? How do I figure out what line of code in takeTurn(...) triggered the failing assertion failure?
2
0
112
Jun ’25
Questions about calculate the square root using Accelerate
I am currently studying the Accelerate library by referring to Apple documentation. Here is the link to the referenced document: https://developer.apple.com/documentation/accelerate/veclib/vforce When I executed the sample code provided at the bottom of the document, I found a case where the results were different. let n = 10_000 let x = (0..&lt;n).map { _ in Float.random(in: 1 ... 10_000) } let y = x.map { return sqrt($0) } and let y = [Float](unsafeUninitializedCapacity: n) { buffer, initializedCount in vForce.sqrt(x, result: &amp;buffer) initializedCount = n } The code below is provided to observe the issue described above. import Accelerate Task { let n = 1//10_000 let x = (0..&lt;n).map { _ in Float(6737.015)//Float.random(in: 1 ... 10_000) } let y = x.map { return sqrt($0) } try? await Task.sleep(nanoseconds: 1_000_000_000) let z = [Float](unsafeUninitializedCapacity: n) { buffer, initializedCount in vForce.sqrt(x, result: &amp;buffer) initializedCount = n } } For a value of 6737.015 when calculating the square root: Using the sqrt(_:) function gives the result 82.07932, While using the vForce.sqrt(_:result:) function gives the result 82.07933. Using a calculator, the value comes out as 82.07932139, which shows that the result from vForce is incorrect. Could you explain the reason behind this difference?
2
0
522
Jan ’25
Default Actor Isolation and foundational protocols
I've been testing my open source libraries with Swift 6.2 and the new Default Actor Isolation concurrency build setting set to MainActor (with Complete strict concurrency turned on). My library Destinations uses protocols extensively, often applying conformance to foundational Swift protocols like Hashable and Identifiable. Many of these basic protocols are not flagged as running on the @MainActor in Beta 1, leading to situations like this: Given this example code: public protocol Contentable: Identifiable { var id: UUID { get } } final class ContentModel: Contentable { let id: UUID = UUID() } I get the warning: Multiline Conformance of 'ContentModel' to protocol 'Contentable' crosses into main actor-isolated code and can cause data races; this is an error in the Swift 6 language mode The fix it suggests is to put a @MainActor before the Contentable protocol declaration in ContentModel, which seems to be a new attribute configuration in Swift 6.2. This solves the warning, but would create a lot of extra noise across the codebase. Was it an oversight or a temporary omission that protocols like Hashable and Identifiable do not run on @MainActor by default, or is there some other reason they are excluded? Considering how often protocols in our code may conform to foundational protocols like this, it seems at odds to the MainActor mode of the Default Actor Isolation setting given that it was created to make concurrency easier and less boilerplate to implement.
2
1
186
Jun ’25
Using InlineArray on older OS versions
Hi, I’m trying to use the new InlineArray type, but noticed that it is unfortunately only available on macOS 26 and not on macOS 15 and others. As this is quite an essential type, I was wondering if this is intended or will this change in later beta’s? Not having it available on older Darwin platforms would severily limit it’s usage in the coming years. Thanks!
2
1
121
Jun ’25