如果不存在则追加对象 swift

append object if not exist swift

我是 swift 语言的新手,我正在尝试为我的问题找到解决方案。 我创建了一个名为 Book

的 class

我正在尝试创建书籍。一本书有name(创建后不可更改),purchaseid(创建后不可更改),market price(可更改)

还有一个 class 架子。书架有名称(创建后不能更改)和一组书籍(可以通过调用添加和删除方法更改,并且在图书购买 ID 上是唯一的——即没有重复的购买 ID)。 Shelf也有计算书架平均价格的方法。

我正在尝试找到一种解决方案,了解如何在添加到数组之前检查数组并获取图书 purchaseId 并从数组中删除一本书。

这是我的代码:

class Book{
    let name: String
    let purchaseID: Int
    let marketPrice: Double




    init(name: String, purchaseID: Int, marketPrice: Double) {
        self.name = name
        self.purchaseID = purchaseID
        self.marketPrice = marketPrice
    }


    func bookPrinter() -> String {
        return "Name: \(self.name) Price: \(marketPrice)"

    }

}

class Shelf{
    private let shelfName: String
    private var arrayOfBooks = [Book]()


    init(shelfName: String) {
        self.shelfName = shelfName
    }

    func add(book : Book ){
   
    
    }

   
    func delete(book : Book){

    }


    func printer() {
        for b in self.arrayOfBooks{
            print(b.bookPrinter())
        }
    }

}

对于add(book:)函数,如果书中的purchaseID是唯一的,可以使用contains(where:)函数来判断数组中是否已经存在Book

func add(book: Book){
    if !arrayOfBooks.contains(where: { [=10=].purchaseID == book.purchaseID }) {
        arrayOfBooks.append(book)
    }
}

或者为Book添加一个符合Equatable协议的扩展:

extension Book: Equatable {
    static func == (lhs: Book, rhs: Book) -> Bool {
        return lhs.purchaseID == rhs.purchaseID
    }
}

并简化您的 add(book:) 函数:

func add(book: Book){
    if !arrayOfBooks.contains(book) {
        arrayOfBooks.append(book)
    }
}

对于delete(book:)函数你可以使用数组的removeAll(where:)函数:

func delete(book: Book){
    arrayOfBooks.removeAll(where: { [=13=].purchaseID == book.purchaseID })
}

然而,正如@LeoDabus 在评论中所说,如果图书订购不重要,您应该使用 Set。在某些方面会更快。

一个实现可能是这样的:

extension Book: Hashable {
    static func == (lhs: Book, rhs: Book) -> Bool {
        return lhs.purchaseID == rhs.purchaseID
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(purchaseID)
    }
}

class Shelf {
    private let shelfName: String
    private var setOfBooks = Set<Book>()

    init(shelfName: String) {
        self.shelfName = shelfName
    }

    func add(book: Book){
        setOfBooks.insert(book)
    }

    func delete(book: Book){
        setOfBooks.remove(book)
    }
}