如果不存在则追加对象 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)
}
}
我是 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)
}
}