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?
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
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)?
On iOS 18 some string functions return incorrect values in some cases.
Found problems on replacingOccurrences() and split() functions, but there may be others.
In the results of these functions in some cases a character is left in the result string when it shouldn't.
This did not happen on iOS17 and older versions.
I created a very simple Test Project to reproduce the problem.
If I run these tests on iOS17 or older the tests succeed.
If I run these tests on iOS18 the tests fail.
test_TestStr1() function shows a problem in replacingOccurrences() directly using strings.
test_TestStr2() function shows a problem in split() that seems to happen only when bridging from NSString to String.
import XCTest
final class TestStrings18Tests: XCTestCase {
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDownWithError() throws {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
func test_TestStr1()
{
let str1 = "_%\u{7}1\u{7}_";
let str2 = "%\u{7}1\u{7}";
let str3 = "X";
let str4 = str1.replacingOccurrences(of: str2, with: str3);
//This should be true
XCTAssertTrue(str4 == "_X_");
}
func test_TestStr2()
{
let s1 = "TVAR(6)\u{11}201\"Ã\"\u{11}201\"A\"";
let s2 = s1.components(separatedBy: "\u{11}201");
let t1 = NSString("TVAR(6)\u{11}201\"Ã\"\u{11}201\"A\"") as String;
let t2 = t1.components(separatedBy: "\u{11}201");
XCTAssertTrue(s2.count == t2.count);
let c = s2.count
//This should be True
XCTAssertTrue(s2[0] == t2[0]);
}
}
Topic:
Programming Languages
SubTopic:
Swift
Using the DebugDescription macro to display an optional value produces a “String interpolation produces a debug description for an optional value” build warning.
For example:
@DebugDescription
struct MyType: CustomDebugStringConvertible {
let optionalValue: String?
public var debugDescription: String {
"Value: \(optionalValue)"
}
}
The DebugDescription macro does not allow (it is an error)
"Value: \(String(describing: optionalValue))"
or
"Value: \(optionalValue ?? "nil")"
because “Only references to stored properties are allowed.”
Is there a way to reconcile these?
I have a build log full of these warnings, obscuring real issues.
Hi I'm new here - I'm trying to learn Swift and SwiftUI.
Tried on PluralSight and Udemy but they have been outdated and thus hard to follow.
So after finding Apples own guides I felt relieved and happy, but now I'm stuck again.
After they've updated Xcode to use #Preview instead of PreviewProvider it's hard to follow along on their tutorial.
Does anyone know of good resources to study SwiftUI? Or know if apple plan to update their tutorials any time soon?
I'm here now if anyone's interested or it's useful information: https://developer.apple.com/tutorials/app-dev-training/managing-state-and-life-cycle
Does anyone know if there will be a Swift 6 version of "The Swift Programming Language" book and if so, when it will be released for Apple Books?
Topic:
Programming Languages
SubTopic:
Swift
I am encountering a strange issue. I have a class that manages a selection of generic items T in an Array. It's a work in progress, but I'l try to give a gist of the setup.
class FileManagerItemModel: NSObject, Identifiable, Codable, NSCopying, Transferable, NSItemProviderReading, NSItemProviderWriting {
var id: URL
static func == (lhs: FileManagerItemModel, rhs: FileManagerItemModel) -> Bool {
lhs.fileURL == rhs.fileURL
}
var fileURL: URL {
FileManagerItemModel.normalizedFileURL(type: type,
rootURL: rootURL,
filePath: filePath)
}
init(type: FileManagerItemType, rootURL: URL, fileURL: URL) {
self.type = type
self.rootURL = rootURL
self.filePath = FileManagerItemModel.filePathRelativeToRootURL(fileURL: fileURL, rootURL: rootURL) ?? "[unknown]"
self.id = FileManagerItemModel.normalizedFileURL(type: type,
rootURL: rootURL,
filePath: filePath)
}
}
The class that manages the selection of these FileManagerItemModels is like so:
@Observable
class MultiSelectDragDropCoordinator<T: Hashable>: ObservableObject, CustomDebugStringConvertible {
private(set) var multiSelectedItems: [T] = []
func addToSelection(_ item: T) {
if !multiSelectedItems.contains(where: { $0 == item }) {
multiSelectedItems.append(item)
}
}
...
}
My issue is that the check if !multiSelectedItems.contains(where: { $0 == item }) in func addToSelection fails. The if is always executed, even if multiSelectedItems contains the given item.
Now, my first thought would be to suspect the static func == check. But that check works fine and does what it should do. Equality is defined by the whole fileURL.
So, the if should have worked. And If I put a breakpoint in func addToSelection on the if, and type po multiSelectedItems.contains(where: { $0 == item }) in the debug console, it actually returns true if the item is in multiSelectedItems. And it properly return false if the item is not in multiSelectedItems.
Still, if I then continue stepping through the app after the breakpoint was hit and I confirmed that the contains should return true, the app still goes into the if, and adds a duplicate item.
I tried assigning to a variable, I tried using a function and returning the true/false. Nothing helps.
Does anyone have an idea on why the debugger shows one (the correct and expected) thing but the actual code still does something different?
Topic:
Programming Languages
SubTopic:
Swift
The following code works when compiling for macOS:
print(NSMutableDictionary().isEqual(to: NSMutableDictionary()))
but produces a compiler error when compiling for iOS:
'NSMutableDictionary' is not convertible to '[AnyHashable : Any]'
NSDictionary.isEqual(to:) has the same signature on macOS and iOS. Why does this happen? Can I use NSDictionary.isEqual(_:) instead?
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 :-)
I notice that Swift Data type's hashValue collision when first 80 byte of data and data length are same because of the Implementation only use first 80 bytes to compute the hash.
https://web.archive.org/web/20120605052030/https://opensource.apple.com/source/CF/CF-635.21/CFData.c
also, even if hash collision on the situation like this, I can check data is really equal or not by ==
does there any reason for this implementation(only use 80 byte of data to make hashValue)?
test code is under below
let dataArray: [UInt8] = [
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
]
var dataArray1: [UInt8] = dataArray
var dataArray2: [UInt8] = dataArray
dataArray1.append(contentsOf: [0x00, 0x00, 0x00, 0x00])
dataArray2.append(contentsOf: [0xff, 0xff, 0xff, 0xff])
let data1 = Data(dataArray1)
let data2 = Data(dataArray2) // Only last 4 byte differs
print(data1.hashValue)
print(data2.hashValue)
print(data1.hashValue == data2.hashValue) // true
print(data1 == data2) // false
For my app I've created a Dictionary that I want to persist using AppStorage
In order to be able to do this, I added RawRepresentable conformance for my specific type of Dictionary. (see code below)
typealias ScriptPickers = [Language: Bool]
extension ScriptPickers: @retroactive RawRepresentable where Key == Language, Value == Bool {
public init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode(ScriptPickers.self, from: data)
else {
return nil
}
self = result
}
public var rawValue: String {
guard let data = try? JSONEncoder().encode(self), // data is Data type
let result = String(data: data, encoding: .utf8) // coerce NSData to String
else {
return "{}" // empty Dictionary represented as String
}
return result
}
}
public enum Language: String, Codable, {
case en = "en"
case fr = "fr"
case ja = "ja"
case ko = "ko"
case hr = "hr"
case de = "de"
}
This all works fine in my app, however trying to run any tests, the build fails with the following:
Conflicting conformance of 'Dictionary<Key, Value>' to protocol 'RawRepresentable'; there cannot be more than one conformance, even with different conditional bounds
But then when I comment out my RawRepresentable implementation, I get the following error when attempting to run tests:
Value of type 'ScriptPickers' (aka 'Dictionary<Language, Bool>') has no member 'rawValue'
I hope Joseph Heller is out there somewhere chuckling at my predicament
any/all ideas greatly appreciated
I found a similar problem here https://developer.apple.com/forums/thread/764777 and I could solve my problem by wrapping the call to requestAutomaticPassPresentationSuppression in a call to DispatchQueue.global().async.
But my question is if this is really how things should work. Even with strict concurrency warnings in Swift 6 I don't get any warnings. Just a runtime crash.
How are we supposed to find these problems? Couldn't the compiler assist with a warning/error.
Why does the compiler make the assumptions it does about the method that is declared like this:
@available(iOS 9.0, *)
open class func requestAutomaticPassPresentationSuppression(responseHandler: @escaping (PKAutomaticPassPresentationSuppressionResult) -> Void) -> PKSuppressionRequestToken
Now that we have migrated to Swift 6 our code base contains a bunch of unknown places where it will crash as above.
I have configured DateFormatter in the following way:
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
df.locale = .init(identifier: "en")
df.timeZone = .init(secondsFromGMT: 0)
in some user devices instead of ISO8601 style it returns date like 09/25/2024 12:00:34
Tried to change date format from settings, changed calendar and I think that checked everything that can cause the problem, but nothing helped to reproduce this issue, but actually this issue exists and consumers complain about not working date picker.
Is there any information what can cause such problem? May be there is some bug in iOS itself?
NSPredicate(format: "SELF MATCHES %@", "^[0-9A-Z]+$").evaluate(with: "126𝒥ℰℬℬ𝒢𝒦𝒮33")
Returns true, and I don't know why. 𝒥ℰℬℬ𝒢𝒦𝒮 is not between 0-9 and A-Z, and why it returns true? How to avoid similar problem like this when using NSPredicate?
Hello,
I have a test variable here which works fine:
var quotes: [(quote: String, order: Int)] = [
("I live you the more ...", 1),
("There is nothing permanent ...", 2),
("You cannot shake hands ...", 3),
("Lord, make me an instrument...", 4)
]
and I have a test function which successfully pulls data from a mysql database via a web service and displays it via the "print" function:
func getPrice(){
if let url = URL(string:"https://www.TEST.com/test_connection.php"){
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data{
if let json = try? JSONDecoder().decode([[String:String]].self, from: data){
json.forEach { row in
print(row["quote"]!)
print(row["order"]!)
}
}
else{
}
}
else{
print("wrong :-(")
}
}.resume()
}
}
Please can you tell me how to re-write the quotes variable/array so that it returns the results that are found in the getPrice() function?
Topic:
Programming Languages
SubTopic:
Swift
Hello,
Please can you tell me how to create an array of dictionaries? This code below should create 4 dictionaries in an array, but I'm getting these errors:
For line "var output = [id: "testID", name: "testName"]":
cannot find 'name' in scope
Type '(any AnyObject).Type'
cannot conform to 'Hashable'
For line "return output":
Type '(any AnyObject).Type' cannot conform to 'Hashable'
var quotes: [(id: String, name: String)] {
var output = [[(id: String, name: String)]] ()
for i in 1...4 {
var output = [id: "testID", name: "testName"]
}
return output
}
Topic:
Programming Languages
SubTopic:
Swift
Hello,
This test code for creating an array using a loop works:
var quotes: [(id: String, name: String)] {
var output: [(id: String, name: String)] = []
for i in 1...numberOfRows {
let item: (id: String, name: String) = ("\(i)", "Name \(i)")
output.append(item)
}
return output
}
But if I try to apply this logic to retrieving data from a web service using the below code I am getting 2 errors:
For the line “quotes.append(item)” I am getting the error message “Cannot use mutating member on immutable value: ‘quotes’ is a get-only property."
For the line “return output” I am getting the error message “Cannot find ‘output’ in scope."
if let url = URL(string:"https://www.TEST.com/test_connection.php"){
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data{
if let json = try? JSONDecoder().decode([[String:String]].self, from: data){
json.forEach { row in
var item: (id: String, name: String) = ("test id value", "test name value")
quotes.append(item)
}
return output
}
}
}
}
Topic:
Programming Languages
SubTopic:
Swift
Consider this simple miniature of my iOS Share Extension:
import SwiftUI
import Photos
class ShareViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let itemProviders = (extensionContext?.inputItems.first as? NSExtensionItem)?.attachments {
let hostingView = UIHostingController(rootView: ShareView(extensionContext: extensionContext, itemProviders: itemProviders))
hostingView.view.frame = view.frame
view.addSubview(hostingView.view)
}
}
}
struct ShareView: View {
var extensionContext: NSExtensionContext?
var itemProviders: [NSItemProvider]
var body: some View {
VStack{}
.task{
await extractItems()
}
}
func extractItems() async {
guard let itemProvider = itemProviders.first else { return }
guard itemProvider.hasItemConformingToTypeIdentifier(UTType.url.identifier) else { return }
do {
guard let url = try await itemProvider.loadItem(forTypeIdentifier: UTType.url.identifier) as? URL else { return }
try await downloadAndSaveMedia(reelURL: url.absoluteString)
extensionContext?.completeRequest(returningItems: [])
}
catch {}
}
}
On the line 34
guard let url = try await itemProvider.loadItem
...
I get these warnings:
Passing argument of non-sendable type '[AnyHashable : Any]?' outside of main actor-isolated context may introduce data races; this is an error in the Swift 6 language mode
1.1. Generic enum 'Optional' does not conform to the 'Sendable' protocol (Swift.Optional)
Passing argument of non-sendable type 'NSItemProvider' outside of main actor-isolated context may introduce data races; this is an error in the Swift 6 language mode
2.2. Class 'NSItemProvider' does not conform to the 'Sendable' protocol (Foundation.NSItemProvider)
How to fix them in Xcode 16?
Please provide a solution which works, and not the one which might (meaning you run the same code in Xcode, add your solution and see no warnings).
I tried
Decorating everything with @MainActors
Using @MainActor in the .task
@preconcurrency import
Decorating everything with @preconcurrency
Playing around with nonisolated
Hi Everyone,
I was able to create the String Catalog with all my strings getting automatic into the stringCatalog except the strings from my models where is not swiftUI and where all I have a class with a lot of info for my app.
Some classes are short and I was able to just make the strings localizable by adding on every line:
(String(localized: "Telefone"))
But I have one class which has Line: 1071 and Col: 1610 and every line I have 7 strings that needs to get localized. These 7 strings are repeated on every line.
So I was trying to create a localization for these 7 strings on this class without having to write (String(localized: "Telefone")) 7 times on every line.
is there a way?
Here is short version of my class:
import Foundation
class LensStructFilter: Identifiable {
var description: String
init(description: String) {
self.description = description
}
}
let lensEntriesFilter: [LensStructFilter] = [
LensStructFilter(description: "Focal: 24mm \nAbertura Máxima: F2.8 \nCobertura: FULL FRAME \nBocal: Nikon F \nFoco Mínimo: 0,30m \nDiâmetro Frontal: 52mm \nPeso: 275g \n\nFocal: 35mm \nAbertura Máxima: F2.0 \nCobertura: FULL FRAME \nBocal: Nikon F \nFoco Mínimo: 0,25m \nDiâmetro Frontal: 52mm \nPeso: 205g \n\nFocal: 50mm \nAbertura Máxima: F1.8 \nCobertura: FULL FRAME \nBocal: Nikon F \nFoco Mínimo: 0,45m \nDiâmetro Frontal: 52mm \nPeso: 185g \n\nFocal: 85mm \nAbertura Máxima: F1.8 \nCobertura: FULL FRAME \nBocal: Nikon F \nFoco Mínimo: 0,80m \nDiâmetro Frontal: 67mm \nPeso: 350g \n\nFocal: 105mm MACRO \nAbertura Máxima: F2.8 \nCobertura: FULL FRAME \nBocal: Nikon F \nFoco Mínimo: 0,31m \nDiâmetro Frontal: 62mm \nPeso: 720g"),
LensStructFilter(description: "Focal: 16-35mm \nAbertura Máxima: F2.8 \nCobertura: FULL FRAME \nBocal: EF \nFoco Mínimo: 0,28m \nDiâmetro Frontal (rosca): 82mm \nPeso: 790Kg"),
Thanks
Hi,
I am exploring Closures and trying to understand how they works. Closure have a special key feature that they can capture the context of the variables/constants from surroundings, once captured we can still use them inside the closure even if the scope in which they are defined does not exist.
I want to understand the lifecycle of captured variable/constant i.e., where are these captured variables stored and when these get created and destroyed.
How is memory managed for captured variables or constants in a closure, depending on whether they are value types or reference types?
Topic:
Programming Languages
SubTopic:
Swift