Dive into the world of programming languages used for app development.

All subtopics
Posts under Programming Languages topic

Post

Replies

Boosts

Views

Activity

Compiler exception when using Binding and Swift 6
In my code I use a binding that use 2 methods to get and get a value. There is no problem with swift 5 but when I swift to swift 6 the compiler fails : Here a sample example of code to reproduce the problem : `import SwiftUI struct ContentView: View { @State private var isOn = false var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") Toggle("change it", isOn: Binding(get: getValue, set: setValue(_:))) } .padding() } private func getValue() -> Bool { isOn } private func setValue(_ value: Bool) { isOn = value } }` Xcode compiler log error : 1. Apple Swift version 6.1.2 (swiftlang-6.1.2.1.2 clang-1700.0.13.5) 2. Compiling with the current language version 3. While evaluating request IRGenRequest(IR Generation for file "/Users/xavierrouet/Developer/TestCompilBindingSwift6/TestCompilBindingSwift6/ContentView.swift") 4. While emitting IR SIL function "@$sSbScA_pSgIeAghyg_SbIeAghn_TR". for <<debugloc at "<compiler-generated>":0:0>>Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var LLVM_SYMBOLIZER_PATH` to point to it): 0 swift-frontend 0x000000010910ae24 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56 1 swift-frontend 0x0000000109108c5c llvm::sys::RunSignalHandlers() + 112 2 swift-frontend 0x000000010910b460 SignalHandler(int) + 360 3 libsystem_platform.dylib 0x0000000188e60624 _sigtramp + 56 4 libsystem_pthread.dylib 0x0000000188e2688c pthread_kill + 296 5 libsystem_c.dylib 0x0000000188d2fc60 abort + 124 6 swift-frontend 0x00000001032ff9a8 swift::DiagnosticHelper::~DiagnosticHelper() + 0 7 swift-frontend 0x000000010907a878 llvm::report_fatal_error(llvm::Twine const&, bool) + 280 8 swift-frontend 0x00000001090aef6c report_at_maximum_capacity(unsigned long) + 0 9 swift-frontend 0x00000001090aec7c llvm::SmallVectorBase::grow_pod(void*, unsigned long, unsigned long) + 384 10 swift-frontend 0x000000010339c418 (anonymous namespace)::SyncCallEmission::setArgs(swift::irgen::Explosion&, bool, swift::irgen::WitnessMetadata*) + 892 11 swift-frontend 0x00000001035f8104 (anonymous namespace)::IRGenSILFunction::visitFullApplySite(swift::FullApplySite) + 4792 12 swift-frontend 0x00000001035c876c (anonymous namespace)::IRGenSILFunction::visitSILBasicBlock(swift::SILBasicBlock*) + 2636 13 swift-frontend 0x00000001035c6614 (anonymous namespace)::IRGenSILFunction::emitSILFunction() + 15860 14 swift-frontend 0x00000001035c2368 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 2788 15 swift-frontend 0x00000001033e7c1c swift::irgen::IRGenerator::emitLazyDefinitions() + 5288 16 swift-frontend 0x0000000103573d6c swift::IRGenRequest::evaluate(swift::Evaluator&, swift::IRGenDescriptor) const + 4528 17 swift-frontend 0x00000001035c15c4 swift::SimpleRequest<swift::IRGenRequest, swift::GeneratedModule (swift::IRGenDescriptor), (swift::RequestFlags)17>::evaluateRequest(swift::IRGenRequest const&, swift::Evaluator&) + 180 18 swift-frontend 0x000000010357d1b0 swift::IRGenRequest::OutputType swift::Evaluator::getResultUncached<swift::IRGenRequest, swift::IRGenRequest::OutputType swift::evaluateOrFatalswift::IRGenRequest(swift::Evaluator&, swift::IRGenRequest)::'lambda'()>(swift::IRGenRequest const&, swift::IRGenRequest::OutputType swift::evaluateOrFatalswift::IRGenRequest(swift::Evaluator&, swift::IRGenRequest)::'lambda'()) + 812 19 swift-frontend 0x0000000103576910 swift::performIRGeneration(swift::FileUnit*, swift::IRGenOptions const&, swift::TBDGenOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_deleteswift::SILModule>, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::GlobalVariable**) + 176 20 swift-frontend 0x0000000102f61af0 generateIR(swift::IRGenOptions const&, swift::TBDGenOptions const&, std::__1::unique_ptr<swift::SILModule, std::__1::default_deleteswift::SILModule>, swift::PrimarySpecificPaths const&, llvm::StringRef, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, llvm::GlobalVariable*&, llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator>>) + 156 21 swift-frontend 0x0000000102f5d07c performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_deleteswift::SILModule>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 2108 22 swift-frontend 0x0000000102f5c0a8 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1036 23 swift-frontend 0x0000000102f5f654 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1764 24 swift-frontend 0x0000000102f5dfd8 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 3716 25 swift-frontend 0x0000000102ee20bc swift::mainEntry(int, char const**) + 5428 26 dyld 0x0000000188a86b98 start + 6076 Using Xcode 16.4 / Mac OS 16.4
4
0
1.3k
2w
Best way to measure days between dates
Hey team I'm facing an issue where startDate is 1 January 2025 and endDate is 31 March 2025 between this 2 dates is 90 days, but on my code is being taken as 89 days I've seen the math of the code excludes the first partial day (from midnight to 06:00) on 2025-01-01, which results in 89 full days instead of 90 days. startDate: 2025-01-01 06:00:00 +0000 endDate: 2025-03-31 06:00:00 +0000 this is my function func daysBetweenDates() -> Int? { guard let selectedStartDate = selectedStartDate?.date else { return nil } guard let selectedEndDate = selectedEndDate?.date else { return 0 } let calendar = Calendar.current let dateComponents = calendar.dateComponents([.day], from: selectedStartDate, to: selectedEndDate) return dateComponents.day } what I've tried is reset the hours to 0 so it can take the full day and return 90 days like this func daysBetweenDates() -> Int? { guard let selectedStartDate = selectedStartDate?.date else { return nil } guard let selectedEndDate = selectedEndDate?.date else { return 0 } var calendar = Calendar(identifier: .gregorian) calendar.timeZone = TimeZone(secondsFromGMT: 0) ?? .current let cleanMidNightStartDate = calendar.startOfDay(for: selectedStartDate) let cleanMidNightEndDate = calendar.startOfDay(for: selectedEndDate.addingTimeInterval(24 * 60 * 60)) let dateComponents = calendar.dateComponents([.day], from: cleanMidNightStartDate, to: cleanMidNightEndDate) let daysCount = dateComponents.day ?? 0 return daysCount } this worked for that date specifically but when I tried to change the date for example startDate: 18 December 2024. endDate: 18 March 2025. between those dates we have 90 days but this function now reads 91. what I'm looking is a cleaver solution for this problem so I can have the best posible quality code, thanks in advance!
1
0
516
Dec ’24
Weird crashes when accessing Swift Array
For some time now Xcode has been downloading crash reports from users of my app about crashes related to arrays. One of them looks like this: ... Code Type: ARM-64 Parent Process: launchd [1] User ID: 501 Date/Time: 2024-07-18 14:59:40.4375 +0800 OS Version: macOS 15.0 (24A5289h) ... Crashed Thread: 0 Exception Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x0000000000000001, 0x00000001045048b8 Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5 Terminating Process: exc handler [1771] Thread 0 Crashed: 0 MyApp 0x00000001045048b8 specialized Collection.map<A>(_:) + 596 1 MyApp 0x00000001045011e4 MyViewController.validateToolbarButtons() + 648 (MyViewController.swift:742) ... The relevant code looks like this: class MyViewController { func validateToolbarButtons() { let indexes = tableView.clickedRow == -1 || tableView.selectedRowIndexes.contains(tableView.clickedRow) ? tableView.selectedRowIndexes : IndexSet(integer: tableView.clickedRow) let items = indexes.map({ myArray[$0] }) ... } } The second crash looks like this: ... Code Type: X86-64 (Native) Parent Process: launchd [1] User ID: 502 Date/Time: 2024-07-15 15:53:35.2229 -0400 OS Version: macOS 15.0 (24A5289h) ... Crashed Thread: 0 Exception Type: EXC_BAD_INSTRUCTION (SIGILL) Exception Codes: 0x0000000000000001, 0x0000000000000000 Termination Reason: Namespace SIGNAL, Code 4 Illegal instruction: 4 Terminating Process: exc handler [13244] Thread 0 Crashed: 0 libswiftCore.dylib 0x00007ff812904fc0 _assertionFailure(_:_:flags:) + 288 1 MyApp 0x0000000101a31e04 specialized _ArrayBuffer._getElementSlowPath(_:) + 516 2 MyApp 0x00000001019d04eb MyObject.myProperty.setter + 203 (MyObject.swift:706) 3 MyApp 0x000000010192f66e MyViewController.controlTextDidChange(_:) + 190 (MyViewController.swift:166) ... And the relevant code looks like this: class MyObject { var myProperty: [MyObject] { get { ... } set { let items = newValue.map({ $0.id }) ... } } } What could cause such crashes? Could they be caused by anything other than concurrent access from multiple threads (which I'm quite sure is not the case here, as I only access these arrays from the main thread)?
16
0
2.3k
Mar ’25
json array shows in debugger but can't parse
Hello, I have a json array showing in Xcode debugger (from the line "print(dataString)"): Optional("[{\"id\":\"8e8tfdcssu4u2hn7a71tkveahjhn8xghqcfkwf1bzvtrw5nu0b89w\",\"name\":\"Ameliana\",\"country\":\"France\",\"type\":\"Private\\/Corporate\",\"overallrecsit\":\"Positive\",\"dlastupd\":\"1741351633\",\"doverallrecsit\":\"1546848000\"},{\"id\":\"z69718a1a5z2y5czkwrhr1u37h7h768v05qr3pf1fegh4r4yrt5a68\",\"name\":\"Timberland\",\"country\":\"Switzerland\",\"type\":\"Charter\",\"overallrecsit\":\"Negative\",\"dlastupd\":\"1741351615\",\"doverallrecsit\":\"1740434582\"}, But my JSON decoder is throwing the catch error "Error in JSON parsing" This is the code: super.viewDidLoad() let urlString = "https://www.pilotjobsnetwork.com/service_ios.php" let url = URL(string: urlString) guard url != nil else { return } let session = URLSession.shared let dataTask = session.dataTask(with: url!) { (data, response, error) in var dataString = String(data: data!, encoding: String.Encoding.utf8) print(dataString) if error == nil &amp;&amp; data != nil { // Parse JSON let decoder = JSONDecoder() do { let newsFeed = try decoder.decode(NewsFeed.self, from: data!) print(newsFeed) print(error) } catch{ print("Error in JSON parsing") } } } // Make the API Call dataTask.resume() } And this is my Codable file NewsFeed.swift: struct NewsFeed: Codable { var id: String var name: String var country: String var type: String var overallrecsit: String var dlastupd: String var doverallrecsit: String } Please do you know why the parsing may be failing? Is it significant that in the debugging window the JSON is displaying backslashes before the quotation marks? Thank you for any pointers :-)
2
0
345
Mar ’25
How to implement thread-safe property wrapper notifications across different contexts in Swift?
I’m trying to create a property wrapper that that can manage shared state across any context, which can get notified if changes happen from somewhere else. I'm using mutex, and getting and setting values works great. However, I can't find a way to create an observer pattern that the property wrappers can use. The problem is that I can’t trigger a notification from a different thread/context, and have that notification get called on the correct thread of the parent object that the property wrapper is used within. I would like the property wrapper to work from anywhere: a SwiftUI view, an actor, or from a class that is created in the background. The notification preferably would get called synchronously if triggered from the same thread or actor, or otherwise asynchronously. I don’t have to worry about race conditions from the notification because the state only needs to reach eventuall consistency. Here's the simplified pseudo code of what I'm trying to accomplish: // A single source of truth storage container. final class MemoryShared<Value>: Sendable { let state = Mutex<Value>(0) func withLock(_ action: (inout Value) -> Void) { state.withLock(action) notifyObservers() } func get() -> Value func notifyObservers() func addObserver() } // Some shared state used across the app static let globalCount = MemoryShared<Int>(0) // A property wrapper to access the shared state and receive changes @propertyWrapper struct SharedState<Value> { public var wrappedValue: T { get { state.get() } nonmutating set { // Can't set directly } } var publisher: Publisher {} init(state: MemoryShared) { // ... } } // I'd like to use it in multiple places: @Observable class MyObservable { @SharedState(globalCount) var count: Int } actor MyBackgroundActor { @SharedState(globalCount) var count: Int } @MainActor struct MyView: View { @SharedState(globalCount) var count: Int } What I’ve Tried All of the examples below are using the property wrapper within a @MainActor class. However the same issue happens no matter what context I use the wrapper in: The notification callback is never called on the context the property wrapper was created with. I’ve tried using @isolated(any) to capture the context of the wrapper and save it to be called within the state in with unchecked sendable, which doesn’t work: final class MemoryShared<Value: Sendable>: Sendable { // Stores the callback for later. public func subscribe(callback: @escaping @isolated(any) (Value) -> Void) -> Subscription } @propertyWrapper struct SharedState<Value> { init(state: MemoryShared<Value>) { MainActor.assertIsolated() // Works! state.subscribe { MainActor.assertIsolated() // Fails self.publisher.send() } } } I’ve tried capturing the isolation within a task with AsyncStream. This actually compiles with no sendable issues, but still fails: @propertyWrapper struct SharedState<Value> { init(isolation: isolated (any Actor)? = #isolation, state: MemoryShared<Value>) { let (taskStream, continuation) = AsyncStream<Value>.makeStream() // The shared state sends new values to the continuation. subscription = state.subscribe(continuation: continuation) MainActor.assertIsolated() // Works! let task = Task { _ = isolation for await value in taskStream { _ = isolation MainActor.assertIsolated() // Fails } } } } I’ve tried using multiple combine subjects and publishers: final class MemoryShared<Value: Sendable>: Sendable { let subject: PassthroughSubject<T, Never> // ... var publisher: Publisher {} // ... } @propertyWrapper final class SharedState<Value> { var localSubject: Subject init(state: MemoryShared<Value>) { MainActor.assertIsolated() // Works! handle = localSubject.sink { MainActor.assertIsolated() // Fails } stateHandle = state.publisher.subscribe(localSubject) } } I’ve also tried: Using NotificationCenter Making the property wrapper a class Using NSKeyValueObserving Using a box class that is stored within the wrapper. Using @_inheritActorContext. All of these don’t work, because the event is never called from the thread the property wrapper resides in. Is it possible at all to create an observation system that notifies the observer from the same context as where the observer was created? Any help would be greatly appreciated!
2
0
540
Mar ’25
Attrubute can only be applied to types not declarations
Error: "Attrubute can only be applied to types not declarations" on line 2 : @unchecked @unchecked enum ReminderRow : Hashable, Sendable { case date case notes case time case title var imageName : String? { switch self { case .date: return "calendar.circle" case .notes: return "square.and.pencil" case .time: return "clock" default : return nil } } var image : UIImage? { guard let imageName else { return nil } let configuration = UIImage.SymbolConfiguration(textStyle: .headline) return UIImage(systemName: imageName, withConfiguration: configuration) } var textStyle : UIFont.TextStyle { switch self { case .title : return .headline default : return .subheadline } } }
1
0
315
Oct ’25
Basic c++xcodeproj call to swift code
I have c++ macOs app(Xcode +14) and I try to add call to swift code. I can't find any simple c++ xcodeproj call to swift code. I create new simple project and fail to build it with error when I try to include #include <SwiftMixTester/SwiftMixTester-Swift.h>: main.m:9:10: error: 'SwiftMixTester/SwiftMixTester-Swift.h' file not found (in target 'CppCallSwift' from project 'CppCallSwift') note: Did not find header 'SwiftMixTester-Swift.h' in framework 'SwiftMixTester' (loaded from '/Users/yanivsmacm4/Library/Developer/Xcode/DerivedData/CppCallSwift-exdxjvwdcczqntbkksebulvfdolq/Build/Products/Debug') . Please help.
5
0
442
Oct ’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
435
Oct ’25
Not understanding synchronous/asynchronous code
Hello, For the below code please can you tell me why the test code print("line 64") is being printed after the test code print("line 84") ? (i.e. how do I stop that happening?) I would like the program to wait until the results array has been parsed before continuing the code (otherwise it does not have content to present). I'm a bit confused why this is happening because I haven't written "async" anywhere. import UIKit struct NewsFeed: Codable { var id: String var name: String var country: String var type: String var situation: String var timestamp: String } class QuoteTableViewController: UITableViewController { var newsFeed: [[String: String]] = [] override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // let selectedQuote = quotes[indexPath.row] // performSegue(withIdentifier: "moveToQuoteDetail", sender: selectedQuote) } override func viewDidLoad() { super.viewDidLoad() // tableView.dataSource = self } // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // (viewDidLoad loads after tableView) // try getting array results here let urlString = "https://www.notafunnyname.com/jsonmockup.php" let url = URL(string: urlString) let session = URLSession.shared let dataTask = session.dataTask(with: url!) { (data, response, error) in var dataString = String(data: data!, encoding: String.Encoding.utf8) if error == nil && data != nil { // Parse JSON let decoder = JSONDecoder() do { var newsFeed = try decoder.decode([NewsFeed].self, from: data!) print("line 64") // print(newsFeed) // print("line 125") // print(newsFeed.count) print(error) } catch{ print("Line 72, Error in JSON parsing") print(error) } } } // Make the API Call dataTask.resume() // #warning Incomplete implementation, return the number of rows print("line 84") print(newsFeed.count) return 10 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) let cell = UITableViewCell () cell.textLabel?.text = "test" return cell } /* // Override to support conditional editing of the table view. override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } */ /* // Override to support editing the table view. override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } */ /* // Override to support rearranging the table view. override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } */ // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. // getPrice() print("test_segue") if let quoteViewController = segue.destination as? QuoteDetailViewController{ if let selectedQuote = sender as? String { quoteViewController.title = selectedQuote } } } } Many thanks
1
0
118
Mar ’25
Using `@ObservedObject` in a function
No real intruduction for this, so I'll get to the point: All this code is on GitHub: https://github.com/the-trumpeter/Timetaber-for-iWatch But first, sorry; /* I got roasted, last time I posted; for not defining my stuff. This'll be different, but's gonna be rough; 'cuz there's lots and lots to get through: */ //this is 'Timetaber Watch App/Define (No expressions)/Courses_vDef.swift' on the GitHub: struct Course { let name: String let icon: String let room: String let colour: String let listName: String let listIcon: String let joke: String init(name: String, icon: String, room: String? = nil, colour: String, listName: String? = nil, listIcon: String? = nil, joke: String? = nil) { self.name = name self.icon = icon self.room = room ?? "None" self.colour = colour self.listName = listName ?? name self.listIcon = listIcon ?? (icon+".circle.fill") self.joke = joke ?? "" } } //this is 'Timetaber Watch App/TimeManager_fDef.swift' on the GitHub: func getCurrentClass(date: Date) -> Array<Course> { //returns the course in session depending on the input date //it is VERY long but //all you really need to know is what it returns: //basically: return [rightNow, nextUp] } /* I thought that poetry would be okay, But poorly thought things through: For I'll probably find that people online will treat my rhymes like spew. */ So into the question: I have a bunch of views, all (intendedly) watching two variables inside of a class: //Github: 'Timetaber Watch App/TimetaberApp.swift' class GlobalData: ObservableObject { @Published var currentCourse: Course = getCurrentClass(date: .now)[0] // the current timetabled class in session. @Published var nextCourse: Course = getCurrentClass(date: .now)[1] // the next timetabled class in session } ...and a bunch of views using them in different ways as follows: (Sorry, don't have the characters to define functions called in these) import SwiftUI //Github: 'Timetaber Watch App/Views/HomeView.swift' struct HomeView: View { @StateObject var data = GlobalData() var body: some View { //HERE: let icon = data.currentCourse.icon let name = data.currentCourse.name let colour = data.currentCourse.colour let room = roomOrBlank(course: data.currentCourse) let next = data.nextCourse VStack { //CURRENT CLASS Image(systemName: icon) .foregroundColor(Color(colour))//add an SF symbol element .imageScale(.large) .font(.system(size: 25).weight(.semibold)) Text(name) .font(.system(size:23).weight(.bold)) .foregroundColor(Color(colour)) .padding(.bottom, 0.1) //ROOM Text(room+"\n") .multilineTextAlignment(.center) .foregroundStyle(.gray) .font(.system(size: 15)) if next.name != noSchool.name { Spacer() //NEXT CLASS Text(nextPrefix(course: next)) .font(.system(size: 15)) Text(getNextString(course: next)) .font(.system(size: 15)) .multilineTextAlignment(.center) } }.padding() } } // Github: 'Timetaber Watch App/Views/ListView.swift' struct listTemplate: View { @StateObject var data = GlobalData() var listedCourse: Course = failCourse(feedback: "lT.12") var courseTime: String = "" init(course: Course, courseTime: String) { self.courseTime = courseTime self.listedCourse = course } var body: some View { let localroom = if listedCourse.room == "None" { "" } else { listedCourse.room } let image = if listedCourse.listIcon == "custom1" { Image(.paintbrushPointedCircleFill) } else { Image(systemName: listedCourse.listIcon) } HStack{ image .foregroundColor(Color(listedCourse.colour)) .padding(.leading, 5) Text(listedCourse.name) .bold() Spacer() Text(courseTime) Text(localroom).bold().padding(.trailing, 5) } .padding(.bottom, 1) .background(data.currentCourse.name==listedCourse.name ? Color(listedCourse.colour).colorInvert(): nil) //HERE } } struct listedDay: View { let day: Dictionary<Int, Course> var body: some View { let dayKeys = Array(day.keys).sorted(by: <) List { ForEach((0...dayKeys.count-2), id: \.self) { let num = $0 listTemplate(course: day[dayKeys[num]] ?? failCourse(feedback: "lD.53"), courseTime: time24toNormal(time24: dayKeys[num])) } } } } struct ListView: View { var body: some View { if storage.shared.termRunningGB && weekdayFunc(inDate: .now) != 1 && weekdayFunc(inDate: .now) != 7 { ScrollView { listedDay( day: getTimetableDay( isWeekA: getIfWeekIsA_FromDateAndGhost( originDate: .now, ghostWeek: storage.shared.ghostWeekGB ), weekDay: weekdayFunc(inDate: .now) ) ) } } else if !storage.shared.termRunningGB { Text("There's no term running.\nThe day's classes will be displayed here.") .multilineTextAlignment(.center) .foregroundStyle(.gray) .font(.system(size: 13)) } else { Text("No school today.\nThe day's classes will be displayed here.") .multilineTextAlignment(.center) .foregroundStyle(.gray) .font(.system(size: 13)) } } } //There's one more view but I can't fit it for characters. //On GitHub: 'Timetaber Watch App/Views/SettingsView.swift' So... THE FUNCTION: This function is called when changes are made that will affect the correct output of getCurrentClass. It is intended to reload the views and the current/next variables to reflect those changes.\ //GHub: 'Timetaber Watch App/StorageManager.swift' func reload() -> Void { @ObservedObject var globalData: GlobalData //this line is erroring, I don't know how to fix it. Is this even the best/proper way to do this? let courseData = getCurrentClass(date: .now) globalData.currentCourse = courseData[0] globalData.nextCourse = courseData[1] //Variable '_globalData' used by function definition before being initialized //that is the error appearing on those above two redefinitions. print("Setup done\n") } Thanks! -Gill
1
0
287
Mar ’25
How to dismiss an ImmersiveSpace when the main window closes?
I noticed that when I enter the fully immersive view and then click the X button below the window, the immersive space remains active, and the only way to dismiss it is to click the digital crown. On other apps (Disney+ for example), closing out of the main window while in immersive mode also closes out the immersive space. I tried applying an onDisappear modifier to the the Modules view with a dismissImmersiveSpace, but that doesn't appear to do anything. Any help would be appreciated.
1
0
521
Dec ’24
Include swift class as an Instance variable in a C++ class
Is there a way to achieve the following using C++/Swift interoperability: class MyCppClass { public: ... ... private: bool member1; ACppClass member2; ASwiftClass member3; } I'm aware of the recent C++/Objective-C interoperability compiler setting, but can't find any information on whether this is possible. I've watched the Apple video: https://developer.apple.com/videos/play/wwdc2023/10172/ and seen this post from Quinn: https://developer.apple.com/forums/thread/768928 but I don't see anyone discussing this kind of situation. Thanks in advance.
4
0
111
Mar ’25
Symbol not found: (_objc_claimAutoreleasedReturnValue)
When I run app, it works on iOS16+ device. But when I run on iOS15 device just working on debug mode, if I run release or profile modeI got runtime error: Log: (lldb) dyld[4928]: Symbol not found: (_objc_claimAutoreleasedReturnValue) Referenced from: '/private/var/containers/Bundle/Application/C724D7C6-82FA-4AF3-AE83-EC035B4429A5/Runner.app/Frameworks/geolocator_apple.framework/geolocator_apple' Expected in: '/usr/lib/libobjc.A.dylib' thread #1, stop reason = signal SIGABRT frame #0: 0x0000000106cbb2cc dyld`__abort_with_payload + 8 dyld`__abort_with_payload: -&amp;gt; 0x106cbb2cc &amp;lt;+8&amp;gt;: b.lo 0x106cbb2e8 ; &amp;lt;+36&amp;gt; 0x106cbb2d0 &amp;lt;+12&amp;gt;: stp x29, x30, [sp, #-0x10]! 0x106cbb2d4 &amp;lt;+16&amp;gt;: mov x29, sp 0x106cbb2d8 &amp;lt;+20&amp;gt;: bl 0x106c8164c ; cerror_nocancel Target 0: (Runner) stopped. Flutter doctor : Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.29.2, on macOS 15.2 24C101 darwin-arm64, locale en-VN) [✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) [✓] Xcode - develop for iOS and macOS (Xcode 16.2) [✓] Chrome - develop for the web [✓] Android Studio (version 2024.2) [✓] VS Code (version 1.97.2)
1
0
233
Mar ’25
Why doesn’t getAPI() show up in autocomplete despite having a default implementation in a protocol extension?
I’m working on a project in Xcode 16.2 and encountered an issue where getAPI() with a default implementation in a protocol extension doesn’t show up in autocomplete. Here’s a simplified version of the code: import Foundation public protocol Repository { func getAPI(from url: String?) } extension Repository { public func getAPI(from url: String? = "https://...") { getAPI(from: url) } } final class _Repository: Repository { func getAPI(from url: String?) { // Task... } } let repo: Repository = _Repository() repo.getAPI( // Autocomplete doesn't suggest getAPI() I’ve tried the following without success: • Clean build folder • Restart Xcode • Reindexing Is there something wrong with the code, or is this a known issue with Xcode 16.2? I’d appreciate any insights or suggestions.
3
0
617
Jan ’25
Cast Any to Sendable
I'm continuing with the migration towards Swift 6. Within one of our libraries, I want to check whether a parameter object: Any? confirms to Sendable. I tried the most obvious one: if let sendable = object as? Sendable { } But that results into the compiler error "Marker protocol 'Sendable' cannot be used in a conditional cast". Is there an other way to do this?
5
0
1.5k
Mar ’25
Returning One Component of Struct as Encoded Value in JSON
I have a class that I want to custom encode into JSON: class Declination: Decodable, Encodable { var asString: String var asDouble: Double init(_ asString: String) { self.asString = asString self.asDouble = raToDouble(asString) } required init(from decoder: Decoder) throws { let value = try decoder.singleValueContainer() self.asString = try value.decode(String.self) self.asDouble = declinationToDouble(asString) } } As you can see, I calculate the double form of the declination when I decode a JSON file containing the data. What I want to do now is ENCODE the class back out as a single string. Currently the standard JSON encode in Swift produces the following: "declination":{"asDouble":18.26388888888889,"asString":"+18:15:50.00"} what I want to produce is: declination:"+18:15:50.00" How can I easily do that? I've read up about custom encoders and such, and I get confused about the containers and what keys are being used. I think there might be a simple answer where I could just code: extension Coordinate: Encodable { func encode(to encoder: Encoder) throws { return encoder.encode(self.asString) } } But experienced Swift developers will immediately see that won't work. Should I do JSONSerialization instead? Can I just write a toString() extension and have JSON pick that up? Any help would be appreciated. Thanks, Robert
1
0
335
Jan ’25
Class not being called?
Hello, I was expecting the code below to print the test message "line 25" because the class "API" is being called on line 57. But "line 25" is not being displayed in the debug window, please could you tell me why? This is the debugging window: line 93 0 line 93 0 line 93 0 import UIKit // not sure these 2 below are needed import SwiftUI import Combine struct NewsFeed: Codable { var id: String var name: String var country: String var type: String var situation: String var timestamp: String } let urlString = "https://www.notafunnyname.com/jsonmockup.php" let url = URL(string: urlString) let session = URLSession.shared class API: ObservableObject { let dataTask = session.dataTask(with: url!) { (data, response, error) in print("line 25") var dataString = String(data: data!, encoding: String.Encoding.utf8) if error == nil && data != nil { // Parse JSON let decoder = JSONDecoder() do { var newsFeed = try decoder.decode([NewsFeed].self, from: data!) print("line 38") // print(newsFeed) // print("line 125") // print(newsFeed.count) print(error) } catch{ print("Line 46, Error in JSON parsing") print(error) } } }.resume // Make the API Call - not sure why but error clears if moved to line above // dataTask.resume() } let myAPIarray = API() class QuoteTableViewController: UITableViewController { var newsFeed: [[String: String]] = [] override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // let selectedQuote = quotes[indexPath.row] // performSegue(withIdentifier: "moveToQuoteDetail", sender: selectedQuote) } override func viewDidLoad() { super.viewDidLoad() // tableView.dataSource = self } // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // (viewDidLoad loads after tableView) // #warning Incomplete implementation, return the number of rows print("line 93") print(newsFeed.count) return 10 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) let cell = UITableViewCell () cell.textLabel?.text = "test" return cell } /* // Override to support conditional editing of the table view. override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } */ /* // Override to support editing the table view. override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } */ /* // Override to support rearranging the table view. override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { } */ /* // Override to support conditional rearranging of the table view. override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the item to be re-orderable. return true } */ // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. // getPrice() print("test_segue") if let quoteViewController = segue.destination as? QuoteDetailViewController{ if let selectedQuote = sender as? String { quoteViewController.title = selectedQuote } } } }
3
0
89
Mar ’25
Why does Array's contains(_:) method cause an error when comparing an optional value with a non-optional value in Swift?
I’m working with Swift and encountered an issue when using the contains method on an array. The following code works fine: let result = ["hello", "world"].contains(Optional("hello")) // ✅ Works fine However, when I try to use the same contains method with the array declared in a separate constant(or variable), I get a compile-time error: let stringArray = ["hello", "world"] let result = stringArray.contains(Optional("hello")) // ❌ Compile-time error The compiler produces the following error message: Cannot convert value of type 'Optional<String>' to expected argument type 'String' Both examples seem conceptually similar, but the second one causes a compile-time error, while the first one works fine. This confuses me because I know that Swift automatically promotes a non-optional value to an optional when comparing it with an optional value. This means "hello" should be implicitly converted to Optional("hello") for the comparison. What I understand so far: The contains(_:) method is defined as: func contains(_ element: Element) -> Bool Internally, it calls contains(where:), as seen in the Swift source code: 🔗 Reference contains(where:) takes a closure that applies the == operator for comparison. Since Swift allows comparing String and String? directly (String is implicitly promoted to String? when compared with an optional), I expected contains(where:) to work the same way. My Questions: Why does the first example work, but the second one fails with a compile-time error? What exactly causes this error in the second case, even though both cases involve comparing an optional value with a non-optional value? Does contains(_:) behave differently when used with an explicit array variable rather than a direct array literal? If so, why? I know that there are different ways to resolve this, like using nil coalescing or optional binding, but what I’m really looking for is a detailed explanation of why this issue occurs at the compile-time level. Can anyone explain the underlying reason for this behavior?
3
0
137
Mar ’25