diff --git a/Sources/FoundationEssentials/UUID.swift b/Sources/FoundationEssentials/UUID.swift index 23b69a115..fa9cbbf62 100644 --- a/Sources/FoundationEssentials/UUID.swift +++ b/Sources/FoundationEssentials/UUID.swift @@ -57,7 +57,7 @@ public struct UUID : Hashable, Equatable, CustomStringConvertible, Sendable { public init(uuid: uuid_t) { self.uuid = uuid } - + /// Returns a string created from the UUID, such as "E621E1F8-C36C-495A-93FC-0C247A3E6E5F" public var uuidString: String { var bytes: uuid_string_t = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) @@ -150,3 +150,11 @@ extension UUID : Comparable { return result < 0 } } + +@available(FoundationPreview 6.2, *) +extension UUID: LosslessStringConvertible { + /// Create a UUID from a string representation conforming to `LosslessStringConvertible`. + public init?(_ description: String) { + self.init(uuidString: description) + } +} diff --git a/Tests/FoundationEssentialsTests/UUIDTests.swift b/Tests/FoundationEssentialsTests/UUIDTests.swift index a21707f55..9a01f4801 100644 --- a/Tests/FoundationEssentialsTests/UUIDTests.swift +++ b/Tests/FoundationEssentialsTests/UUIDTests.swift @@ -115,4 +115,19 @@ final class UUIDTests : XCTestCase { XCTAssertFalse(uuid2 > uuid1) XCTAssertTrue(uuid2 == uuid1) } + + func test_UUIDLosslessStringConvertible() { + let originalString = "E621E1F8-C36C-495A-93FC-0C247A3E6E5F" + let uuidFromString = UUID(originalString) + XCTAssertNotNil(uuidFromString, "UUID must be constructible from valid UUID string via LosslessStringConvertible") + XCTAssertEqual(uuidFromString?.description, originalString, "Round-tripped description must match original UUID string") + + let uuid = UUID(uuidString: originalString)! + XCTAssertEqual(uuid, UUID(uuid.description), "UUID must round-trip through LosslessStringConvertible") + + let invalidString = "not-a-uuid" + let invalidUUID = UUID(invalidString) + XCTAssertNil(invalidUUID, "Invalid UUID strings must result in nil from LosslessStringConvertible initializer") + } + }