সুইফট 4:
সুইফট 4-এর পর থেকে এই কার্যকারিতাটি স্ট্যান্ডার্ড লাইব্রেরিতে যুক্ত করা হয়েছে । আপনি এটি এর মতো ব্যবহার করতে পারেন:
Dictionary(grouping: statEvents, by: { $0.name })
[
"dinner": [
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1)
],
"lunch": [
StatEvents(name: "lunch", date: "01-01-2015", hours: 1),
StatEvents(name: "lunch", date: "01-01-2015", hours: 1)
]
সুইফট 3:
public extension Sequence {
func group<U: Hashable>(by key: (Iterator.Element) -> U) -> [U:[Iterator.Element]] {
var categories: [U: [Iterator.Element]] = [:]
for element in self {
let key = key(element)
if case nil = categories[key]?.append(element) {
categories[key] = [element]
}
}
return categories
}
}
দুর্ভাগ্যক্রমে, append
উপরের ফাংশনটি পরিবর্তনের পরিবর্তে অন্তর্নিহিত অ্যারেটি অনুলিপি করে, এটি পছন্দনীয় হবে। এটি একটি বেশ বড় মন্দার কারণ । আপনি একটি রেফারেন্স টাইপ মোড়ক ব্যবহার করে সমস্যাটি পেতে পারেন:
class Box<A> {
var value: A
init(_ val: A) {
self.value = val
}
}
public extension Sequence {
func group<U: Hashable>(by key: (Iterator.Element) -> U) -> [U:[Iterator.Element]] {
var categories: [U: Box<[Iterator.Element]>] = [:]
for element in self {
let key = key(element)
if case nil = categories[key]?.value.append(element) {
categories[key] = Box([element])
}
}
var result: [U: [Iterator.Element]] = Dictionary(minimumCapacity: categories.count)
for (key,val) in categories {
result[key] = val.value
}
return result
}
}
যদিও আপনি চূড়ান্ত অভিধানটিকে দু'বার অতিক্রম করেছেন, বেশিরভাগ ক্ষেত্রেই এই সংস্করণটি মূলটির চেয়ে দ্রুত।
সুইফট 2:
public extension SequenceType {
func categorise<U : Hashable>(@noescape keyFunc: Generator.Element -> U) -> [U:[Generator.Element]] {
var dict: [U:[Generator.Element]] = [:]
for el in self {
let key = keyFunc(el)
if case nil = dict[key]?.append(el) { dict[key] = [el] }
}
return dict
}
}
আপনার ক্ষেত্রে, আপনি "কীগুলি" keyFunc
নামগুলি দিয়ে ফিরে আসতে পারেন :
currentStat.statEvents.categorise { $0.name }
[
dinner: [
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1)
], lunch: [
StatEvents(name: "lunch", date: "01-01-2015", hours: 1),
StatEvents(name: "lunch", date: "01-01-2015", hours: 1)
]
]
সুতরাং আপনি একটি অভিধান পাবেন, যেখানে প্রতিটি কী একটি নাম এবং প্রতিটি মান সেই নামের সাথে স্ট্যাটএভেন্টসের একটি অ্যারে।
সুইফট ঘ
func categorise<S : SequenceType, U : Hashable>(seq: S, @noescape keyFunc: S.Generator.Element -> U) -> [U:[S.Generator.Element]] {
var dict: [U:[S.Generator.Element]] = [:]
for el in seq {
let key = keyFunc(el)
dict[key] = (dict[key] ?? []) + [el]
}
return dict
}
categorise(currentStat.statEvents) { $0.name }
যা আউটপুট দেয়:
extension StatEvents : Printable {
var description: String {
return "\(self.name): \(self.date)"
}
}
print(categorise(currentStat.statEvents) { $0.name })
[
dinner: [
dinner: 01-01-2015,
dinner: 01-01-2015,
dinner: 01-01-2015
], lunch: [
lunch: 01-01-2015,
lunch: 01-01-2015
]
]
(সুইফেসটবটি এখানে রয়েছে )
Dictionary
init(grouping:by:)
ইনিশিয়ালাইজার ব্যবহার করে ।