質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1867閲覧

【Swift】NSOrderedSetを使っても重複が削除されない

popai306

総合スコア157

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/13 12:25

相談内容

NSOrderedSetを使っても重複する要素が削除されず原因が分かりません。。

Swift

1let books: [Book] = [.init(title :"AAA", imageURL: "AAA"), .init(title :"AAA", imageURL: "AAA")] 2let set = NSOrderedSet(array: books).array as! [Book] 3print(set) // 重複削除されない

Bookクラスは以下の取り定義しています。
Setはハッシュ値を見て重複チェックしていると考えているので、重複削除できるはずだと思うのですが、
なぜできないのでしょうか?

Swift

1class Book: Codable, Hashable { 2 3 var title: String 4 var imageURL: String 5 6 init(title :String, imageURL: String) { 7 self.title = title 8 self.imageURL = imageURL 9 } 10 11 static func == (lhs: Dating, rhs: Dating) -> Bool { 12 return lhs.title == rhs.title && lhs.imageURL == rhs.imageURL 13 } 14 15 public func hash(into hasher: inout Hasher) { 16 hasher.combine(title) 17 hasher.combine(imageURL) 18 } 19}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

static func == (lhs: Dating, rhs: Dating) -> Bool

これって

static func == (lhs: Book, rhs: Book) -> Bool
じゃないですか?

投稿2021/05/13 14:23

hobby2018

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

NSOrderedSet は Objective-C の生き物なので、要素も NSObject のサブクラスにして hash および isEqual メソッドを実装すると良いようです。
参考: cocoa - NSObject subclass in Swift: hash vs hashValue, isEqual vs == - Stack Overflow

swift

1import Foundation 2 3class Book: NSObject, Codable { 4 5 var title: String 6 var imageURL: String 7 8 init(title :String, imageURL: String) { 9 self.title = title 10 self.imageURL = imageURL 11 } 12 13 override var hash: Int { 14 var hasher = Hasher() 15 hasher.combine(title) 16 hasher.combine(imageURL) 17 return hasher.finalize() 18 } 19 20 override func isEqual(_ object: Any?) -> Bool { 21 guard let object = object as? Book else { return false } 22 return title == object.title && imageURL == object.imageURL 23 } 24} 25 26let books: [Book] = [.init(title :"AAA", imageURL: "AAA"), .init(title :"AAA", imageURL: "AAA")] 27let set = NSOrderedSet(array: books).array as! [Book] 28print(set.count) // 1

投稿2021/05/13 14:23

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popai306

2021/05/13 15:23

なるほど! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問