【问题标题】:append object if not exist swift如果不存在,则追加对象 swift
【发布时间】:2021-02-12 06:42:12
【问题描述】:

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

我正在尝试创建 Book。一本书有名称(创建后不可更改)、purchaseid(创建后不可更改)和市场价格(可更改)

还有一个类Shelf。书架有名称(创建后无法更改)和书籍数组(可以通过调用 add 和 delete 方法更改,并且在 book purchaseId 上是唯一的 - 即没有重复的 purchaseId)。 Shelf 还有一种计算书架中书籍平均价格的方法。

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

这是我的代码:

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())
        }
    }

}

【问题讨论】:

  • 您的意思是purchaseId 唯一标识一本书?
  • 如果书架上书籍的顺序无关紧要,您应该使用Set
  • 是的,我的意思是 purchaseId 唯一标识一本书

标签: arrays swift xcode function append


【解决方案1】:

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

func add(book: Book){
    if !arrayOfBooks.contains(where: { $0.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: { $0.purchaseID == book.purchaseID })
}

但是,正如@LeoDabus 在 cmets 中所说,如果订购书不重要,您可能应该使用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)
    }
}

【讨论】:

  • 我更新了我的问题。感谢您的快速回复。
猜你喜欢
  • 2020-07-03
  • 2019-05-09
  • 1970-01-01
  • 2012-04-24
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2012-08-01
相关资源
最近更新 更多