最初にUser
を一意のキーに基づいて等しくなるようにハッシュ化します。
class User: NSObject
{
let key:String
init(key: String) { self.key = key }
override func isEqual(_ object: Any?) -> Bool
{
guard let other = object as? User else { return false }
return self.key == other.key
}
override var hashValue: Int { return key.hashValue }
}
let eq = User(key: "foo") == User(key: "foo") // true
let h1 = User(key: "foo").hashValue // some big number
let h2 = User(key: "foo").hashValue // same big number as above
それはユーザを一意に識別するのに役立つよう、それを変更することはすべきではない、ので、私はkey
不変作りました。
User
は、それがすでにisEqual:
を使用していますので、あなたがキーに基づいて比較することでこれをオーバーライドし==
の実装を持っているNSObject
ですので。また、User
のハッシュ値としてhashValue
のkey
を使用します。
User
をセットで、辞書のキーとして使用できるようになりました。 User
の等価物を比較するようにComment
について同じことを行う場合は、セット内のコメントも使用できます。しかし、それは悪い考えです。 2人のコメントは同じユーザーであるため同じではありません。プロパティUSERCOUNTはあなたが尋ねた番号です
class Comment: NSObject
{
let user: User
let text: String
init(user: User, text: String)
{
self.user = user
self.text = text
}
}
class SomeClass
{
var userComments: [User : [Comment]] = [:]
func addComment(newComment: Comment)
{
if let existingComments = userComments[newComment.user]
{
userComments[newComment.user] = existingComments + [newComment]
}
else
{
userComments[newComment.user] = [newComment]
}
}
var userCount: Int { return userComments.count }
var commentCount: Int { return userComments.values.reduce(0, { $0 + $1.count}) }
}
:あなたは次のようにユーザーをキーと辞書を使用するようにSomeClass
を変更する必要があります。 commentCountプロパティはコメントの総数です。ただし、実装はO(n)時間で実行されます。スピードが本質的である場合は、コメントを追加するたびに増分するカウンタを維持する必要があります。
タイトルに記載されている「NSSet」に関連していますか? –
コメントとユーザーはなぜ「NSObject」から派生したのですか? '構造体 'として持っているほうがはるかに良いと思います。 – Fogmeister
' commentBy'はオプションですか?実際には、著者のないコメントはありません。 – vadian