먼저 고유 키를 기반으로 동일하게 만드는 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
때문에
은 이미 당신이 그 키를 기반으로 비교하기를 오버라이드 (override) isEqual:
를 사용 ==
의 구현이있는 NSObject
입니다. User
해시 값으로 hashValue
의 key
을 사용합니다.
이제 User
을 사전 세트의 키로 사용할 수 있습니다. Comment
에 대해 동일한 작업을 수행하여 User
에있는 동등 물을 비교할 경우 세트의 주석도 사용할 수 있습니다. 그러나 그것은 나쁜 생각입니다. 두 명의 의견은 동일한 사용자를 갖고 있기 때문에 동일하지 않습니다.
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}) }
}
속성 USERCOUNT 당신이 요청 수입니다 : 다음과 같이 사용자가 키가 사전을 사용하는 SomeClass
을 변경해야합니다. commentCount 속성은 총 주석 수입니다.주의해야하지만 구현은 O (n) 시간에 실행됩니다. 속도가 핵심이라면 주석을 추가 할 때마다 증가하는 카운터를 유지해야합니다.
제목과 관련하여 "NSSet"과 관련이 있습니까? –
왜 댓글과 사용자가 'NSObject'에서 파생 되었습니까? 나는 그것들을'Structs'로 가지는 것이 훨씬 더 낫다고 생각합니다. – Fogmeister
'commentBy'는 왜 선택입니까? 실제로 저자가없는 의견은 없습니다. – vadian