Https://www.swiftbysundell.com/posts/the-power-of-key-paths-in-swift দ্বারা অনুপ্রাণিত আমরা আরও একটি শক্তিশালী সরঞ্জাম ঘোষণা করতে পারি যা কোনও কীপ্যাথে ইউনিটির জন্য ফিল্টার করতে সক্ষম। জটিলতা সম্পর্কিত বিভিন্ন উত্তরের বিষয়ে আলেকজান্ডারের মন্তব্যে ধন্যবাদ, নীচের সমাধানগুলি সর্বোত্তম হওয়া উচিত be
অ-পরিবর্তনীয় সমাধান
আমরা এমন একটি ফাংশন দিয়ে প্রসারিত করি যা কোনও কীপথে ইউনিটির জন্য ফিল্টার করতে সক্ষম:
extension RangeReplaceableCollection {
/// Returns a collection containing, in order, the first instances of
/// elements of the sequence that compare equally for the keyPath.
func unique<T: Hashable>(for keyPath: KeyPath<Element, T>) -> Self {
var unique = Set<T>()
return filter { unique.insert($0[keyPath: keyPath]).inserted }
}
}
দ্রষ্টব্য: যে ক্ষেত্রে আপনার অবজেক্টটি রেঞ্জরেপসিয়েবল কালেকশনটির সাথে সামঞ্জস্য করে না, তবে সিকোয়েন্সের সাথে সামঞ্জস্য করে না, আপনার এই অতিরিক্ত এক্সটেনশন থাকতে পারে, তবে রিটার্নের ধরণটি সর্বদা অ্যারে হবে:
extension Sequence {
/// Returns an array containing, in order, the first instances of
/// elements of the sequence that compare equally for the keyPath.
func unique<T: Hashable>(for keyPath: KeyPath<Element, T>) -> [Element] {
var unique = Set<T>()
return filter { unique.insert($0[keyPath: keyPath]).inserted }
}
}
ব্যবহার
যদি আমরা নিজেরাই উপাদানগুলির জন্য ইউনিটিসিটি চাই, যেমন প্রশ্নে রয়েছে, আমরা কীপথটি ব্যবহার করি \.self
:
let a = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
let b = a.unique(for: \.self)
/* b is [1, 4, 2, 6, 24, 15, 60] */
আমরা যদি অন্য কোনও কিছুর জন্য একতা চাই (যেমন id
বস্তুর সংগ্রহের জন্য) তবে আমরা আমাদের পছন্দের কীপথটি ব্যবহার করি:
let a = [CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 1), CGPoint(x: 1, y: 2)]
let b = a.unique(for: \.y)
/* b is [{x 1 y 1}, {x 1 y 2}] */
মিউটেশন সমাধান
আমরা এমন কোনও মিউটেশন ফাংশন দিয়ে প্রসারিত করি যা যে কোনও কীপথে এককতার জন্য ফিল্টার করতে সক্ষম:
extension RangeReplaceableCollection {
/// Keeps only, in order, the first instances of
/// elements of the collection that compare equally for the keyPath.
mutating func uniqueInPlace<T: Hashable>(for keyPath: KeyPath<Element, T>) {
var unique = Set<T>()
removeAll { !unique.insert($0[keyPath: keyPath]).inserted }
}
}
ব্যবহার
যদি আমরা নিজেরাই উপাদানগুলির জন্য ইউনিটিসিটি চাই, যেমন প্রশ্নে রয়েছে, আমরা কীপথটি ব্যবহার করি \.self
:
var a = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
a.uniqueInPlace(for: \.self)
/* a is [1, 4, 2, 6, 24, 15, 60] */
আমরা যদি অন্য কোনও কিছুর জন্য একতা চাই (যেমন id
বস্তুর সংগ্রহের জন্য) তবে আমরা আমাদের পছন্দের কীপথটি ব্যবহার করি:
var a = [CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 1), CGPoint(x: 1, y: 2)]
a.uniqueInPlace(for: \.y)
/* a is [{x 1 y 1}, {x 1 y 2}] */
NSSet
, এনএসএসেট হ'ল এনএসআরার্ডসেট অর্ডার রাখার প্রয়োজনে অবজেক্টগুলির একটি আনর্ডারড সংগ্রহ।