I have the following struct:
extension Models {
struct Book: Identifiable {
let id: UUID
var title: String
var pagesCount: Int
var cover: Optional<Cover>;
struct Cover {
let image: String
init(image: String) {
self.image = image
}
}
init(id: UUID = UUID(), title: String, pagesCount: Int, cover: Optional<Cover> = nil) {
self.id = id
self.title = title
self.pagesCount = pagesCount
self.cover = cover
}
}
}
extension Models.Book {
static let sampleData: Models.Book = Models.Book(title: "Orconomics", pagesCount: 100, cover: Models.Book.Cover(image: "actual_image.png"))
}
and I am creating a SwiftUI view that displays each "model" Book.
I have made the Cover
parameter optional, as some books won't have covers, the Models.Book.Cover
struct has a non-optional property image
.
Here's what I have in the body
of my SwiftUI file:
HStack {
if book.cover != nil {
Text(book.cover?.image ?? "test") // <- can I avoid this?
}
}
Isn't the book.cover != nil
sufficient for Swift? Why do I need the "default value" (test
) and the ?
after book.cover
?
CodePudding user response:
you could try something like this:
HStack {
if let cover = book.cover {
Text(cover.image)
}
}
CodePudding user response:
What I use to do is handle this in my view model so I guess you should have a default value in your init, so I don't need to handle that in the View, since I like the view to be dumb and not deal with much logic.
I think you should use insteaad guard
if you want to add an else option IMO guard is a bit more readable, if not if let
as mentioned before should be fine.
CodePudding user response:
View?
conforms to View
. So just use map
.
book.cover?.image.map(Text.init)