如果不存在,则追加对象 swift

Posted

技术标签:

【中文标题】如果不存在,则追加对象 swift【英文标题】:append object if not exist 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 唯一标识一本书 【参考方案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)
    

【讨论】:

我更新了我的问题。感谢您的快速回复。

以上是关于如果不存在,则追加对象 swift的主要内容,如果未能解决你的问题,请参考以下文章

如果新文件不存在则写入新文件,如果存在则追加到文件

如果不存在,则追加 mysql json 字段

如果不存在,则创建一个 .txt 文件,如果它确实追加一个新行

Erlang - 在外部文件中搜索特定字符串,如果不存在则追加文件

面向对象考试题 第四次考试.

检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)