Что это за [__lldb_expr_19.Book] я получаю в консоли?

avatar
Josh
8 августа 2021 в 16:20
65
1
0

Я практикую функциональность CRUD в дизайне MVC. Ниже у меня есть модель Book и BookShelfModelController. Кажется, все работает правильно, но когда я печатаю на консоли, все, что я получаю, это [__lldb_expr_19.Book]. Если у меня есть несколько книг, я получаю несколько таких [__lldb_expr_19.Book, __lldb_expr_19.Book].

Этот другой ответ StackOverflow (Что такое lldb_expr в Swift Playground?) по сути говорит мне, что класс Book пуст, поэтому консоль не знает, как с ним обращаться. Но моя модель Book не пуста. Как мне сделать так, чтобы при печати bookShelfModelController.books я получал добавленную книгу?

import Foundation

class Book {
    
    init(title: String, author: String, genre: String) {
        self.title = title
        self.author = author
        self.genre = genre
    }
    
    let title: String
    let author: String
    let genre: String
}

extension Book: Equatable {}

func ==(lhs: Book, rhs: Book) -> Bool {
    if lhs.title != rhs.title { return false }
    if lhs.author != rhs.author { return false }
    if lhs.genre != rhs.genre { return false }
    return true
}


class BookShelfModelController {

    var books: [Book] = []
    
    func create(book title: String, author: String, genre: String) -> Book {
        let book = Book(title: title, author: author, genre: genre)
        self.books.append(book)
        return book
    }
    
    func delete(book: Book) {
        if let index = self.books.firstIndex(where: { $0 == book }) {
            self.books.remove(at: index)
        }
    }
}

let bookShelfModelController = BookShelfModelController()

let firstBook = bookShelfModelController.create(book: "Foo", author: "Bar", genre: "FooBar")
let secondBook = bookShelfModelController.create(book: "Foo2", author: "Bar2", genre: "FooBar2")
bookShelfModelController.delete(book: firstBook)

print(bookShelfModelController.books.count)
print(bookShelfModelController.books)
Источник

Ответы (1)

avatar
vadian
8 августа 2021 в 16:28
1

Так Swift описывает классы.

Для большей значимости добавьте это расширение, чтобы принять CustomStringConvertible. В вычисленном свойстве верните все, что хотите

extension Book : CustomStringConvertible {

    var description : String { return "Book \(name) / \(author)" }
}

Тебе действительно нужен урок? Со структурой вы избавляетесь от инициализатора, внедрение Equatable не требует дополнительного кода, и вы получаете лучшее описание бесплатно.

Это может заменить весь ваш класс

struct Book : Equatable {
    let title, author, genre: String
}