Post not yet marked as solved
Hey all,
I noticed a useful macro in the "What's new in Swift" WWDC2023 session called @CaseDetection. Seems like they used it in the presentation without defining it, so I assumed it was included in the Swift 5.9 installation?
@CaseDetection is not a recognized attribute in my XCode 15 beta. Is that expected?
Best,
T
Post not yet marked as solved
Data equality checks have incorrectly changed on iOS 17.
Step to reproduce:
Run XCTestCase file in iOS 16. It will pass.
Run XCTestCase file in iOS 17. It will fail.
Suspected Cause:
In iOS 17, Data has changed how it performs equality. Previously equality did not care about ordered keys, now it does.
I've noticed if I modify the test case to use a JSONEncoder setting of encoder.outputFormatting = .sortedKeys, then it passes.
Reason this is a bug:
This is unexpected and changed behavior. Equality should not care what the ordering of the keys are when comparing one data object to another data object. Ordering is irrelevant for a JSON object. It's the content that matters. This will cause a huge regression for us in our previously released app if this hits production.
XCTestCase:
import XCTest
final class JSONDecodingTest: XCTestCase {
struct Address: Codable {
let street: String
let city: String
let state: String
let postalCode: String
}
struct OrderItem: Codable {
let productID: String
let productName: String
let quantity: Int
}
struct Order: Codable {
let orderID: String
let totalAmount: Double
let items: [OrderItem]
}
struct User: Codable {
let id: Int
let username: String
let email: String
let address: Address
let orders: [Order]
}
struct RootObject: Codable {
let user: User
}
func testData() throws {
let object1Json: String = """
{
"user": {
"id": 12345,
"username": "johndoe",
"email": "john.doe@example.com",
"address": {
"street": "456 Elm St",
"city": "Somewhere",
"state": "NY",
"postalCode": "54321"
},
"orders": [
{
"orderID": "A987",
"totalAmount": 75.99,
"items": [
{
"productID": "P123",
"productName": "Widget",
"quantity": 2
},
{
"productID": "P456",
"productName": "Gizmo",
"quantity": 1
}
]
},
{
"orderID": "B543",
"totalAmount": 32.50,
"items": [
{
"productID": "P789",
"productName": "Thingamajig",
"quantity": 3
}
]
}
]
}
}
"""
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
let itemData = object1Json.data(using: .utf8)!
let item = try JSONDecoder().decode(RootObject.self, from: itemData)
let data1 = try encoder.encode(item)
let data2 = try encoder.encode(item)
XCTAssertTrue(data1 == data2)
}
}
I've filed feedback here: https://feedbackassistant.apple.com/feedback/12995492
I noticed that in WWDC, Apple said they rewrote the entire JSONEncoder & JSONDecoder implementations. This is a massive regression:
https://developer.apple.com/videos/play/wwdc2023/10164/
Post not yet marked as solved
Is swiftdata not available in vision pro?