I’m trying to understand more about the UUID, but can’t understand it 100%
In a class/struct when you give your “Model” properties such
Var id: UUID? Or Var id = UUID()
Var name: String
Var age: Int
What’s the difference between the id properties? One is an optional and needs to for fetching data in the JSON parsing. That part I understand. You loop it.
What I haven’t seen an example where you set the property to “var id = UUID().
Is there someone in this community that maybe can explain how it works?
/ Nicholas.
var id: UUID?
defines an id
property that is an Optional<UUID>
. By default it is nil
and you can assign it a value.
var id = UUID()
defines an id
property that is a UUID
and is given a value when the struct is created. You don’t need to do anything for it to have an assigned value.
You can use either one when decoding JSON. It just depends on if you want your decoded instance to be automatically assigned an id
when it gets created or if you want to manually assign an id
yourself afterwards.
And the type of that id
will always be an Optional<UUID>
with the UUID?
method. That means you will always have to remember to unwrap it when you want to use it. Versus the = UUID()
method, which gives you a type of UUID
that’s not Optional
and so never needs unwrapping.
Also, keep in mind that to use the UUID?
method, you have to make your id
property a var
, meaning you run the risk of accidentally changing it if you make a mistake in your code somewhere. With the = UUID()
method, the id
is assigned at creation and you can make it a let
so the value cannot be changed later.
Sample Playground code:
let jsonData = #"{"name": "Charlotte Grote", "occupation": "solver"}"#.data(using: .utf8)!
struct Person: Identifiable, Codable {
let id = UUID() //let's create a UUID value
let name: String
let occupation: String
}
do {
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: jsonData)
print(person.name) //Charlotte Grote
print(person.id) //B180E929-9699-4B3A-B8A7-A1DF8DB4A3A9
print(type(of: person.id)) //UUID
} catch {
print(error)
}
versus this one:
let jsonData = #"{"name": "Charlotte Grote", "occupation": "solver"}"#.data(using: .utf8)!
struct Person: Identifiable, Codable {
//id must be var so we can change it later
var id: UUID? //default value is nil
let name: String
let occupation: String
}
do {
let decoder = JSONDecoder()
//person needs to be a var here as well so that we can change its properties
var person = try decoder.decode(Person.self, from: jsonData)
person.id = UUID()
print(person.name) //Charlotte Grote
print(person.id) //Optional(D5A1CDD4-7E49-43A4-AEB1-5455F0DEB2D5)
print(type(of: person.id)) //Optional<UUID>
} catch {
print(error)
}
It’s your call which method you prefer and want to use.
2 Likes
Very well explained, thank you