আমি যা বাস্তবায়ন করতে চাই:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
[SomeObject]
পরিবর্তে আমি কীভাবে বস্তুটি ফিরতে পারি Results
?
আমি যা বাস্তবায়ন করতে চাই:
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject)
return objects.count > 0 ? objects : nil
}
[SomeObject]
পরিবর্তে আমি কীভাবে বস্তুটি ফিরতে পারি Results
?
উত্তর:
অদ্ভুত, উত্তরটি খুব সোজা সামনে। এখানে আমি এটি কীভাবে করছি:
let array = Array(results) // la fin
Array
ফলাফল পুনরুক্তিকারী দ্বারা নির্মিত একটি সুইফ্ট প্রদান করে ।
যদি আপনাকে অবশ্যই একে একে রূপান্তর করতে Results
হয় তবে Array
মনে রাখবেন একটি কর্মক্ষমতা এবং স্মৃতি ওভারহেড, যেহেতু Results
অলস। তবে আপনি এটি এক লাইনে করতে পারবেন, যেমন results.map { $0 }
সুইফট ২.০ (বা map(results) { $0 }
1.2 তে)।
map { $0 }
LazyMapRandomAccessCollection
সুইফ্ট 3 এ ফিরে আসবে , সুতরাং @ ম্যাসিওডের উত্তর আরও ভাল।
আমি একটি সমাধান খুঁজে পেয়েছি। ফলাফলগুলিতে এক্সটেনশন তৈরি করা হয়েছে।
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for i in 0 ..< count {
if let result = self[i] as? T {
array.append(result)
}
}
return array
}
}
এবং মত ব্যবহার
class func getSomeObject() -> [SomeObject]? {
let objects = Realm().objects(SomeObject).toArray(SomeObject) as [SomeObject]
return objects.count > 0 ? objects : nil
}
for var i = 0; i < count; i++
for i in 0 ..< count
সুইফট ৪.২ দিয়ে এটি এক্সটেনশনের মতোই সহজ:
extension Results {
func toArray() -> [Element] {
return compactMap {
$0
}
}
}
সমস্ত প্রয়োজনীয় জেনেরিক তথ্য ইতিমধ্যে একটি অংশ Results
যা আমরা প্রসারিত করি।
এটি একটি একক লাইনে সুইফট 3Results
দিয়ে এক্সটেনশান দিয়ে অ্যারেতে রূপান্তর করার অন্য একটি উপায় ।
extension Results {
func toArray() -> [T] {
return self.map { $0 }
}
}
জন্য সুইফট 4 এবং Xcode 9.2
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return flatMap { $0 as? T }
}
}
সঙ্গে Xcode 10 flatMap
অবচিত আপনি ব্যবহার করতে পারেন compactMap
ম্যাপিং জন্য।
extension Results {
func toArray<T>(type: T.Type) -> [T] {
return compactMap { $0 as? T }
}
}
সুইফট 3
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for i in 0 ..< count {
if let result = self[i] as? T {
array.append(result)
}
}
return array
}
}
ব্যবহার
class func getSomeObject() -> [SomeObject]? {
let defaultRealm = try! Realm()
let objects = defaultRealm.objects(SomeObject.self).toArray(ofType : SomeObject.self) as [SomeObject]
return objects.count > 0 ? objects : nil
}
বিকল্প: জেনেরিক ব্যবহার করে
class func getSomeObject() -> [T]? {
let objects = Realm().objects(T.self as! Object.Type).toArray(ofType : T.self) as [T]
return objects.count > 0 ? objects : nil
}
ফলাফলগুলি অ্যারিতে রূপান্তর করা ভাল ধারণা নয়, কারণ ফলাফল অলস। তবে আপনার যদি প্রয়োজন হয় তবে:
func toArray<T>(ofType: T.Type) -> [T] {
return flatMap { $0 as? T }
}
তবে ভাল উপায় হ'ল আপনার প্রয়োজন যেখানে ফলাফলগুলি পাস করা। এছাড়াও আপনি ফলাফলগুলি অ্যারের পরিবর্তে তালিকায় রূপান্তর করতে পারেন।
List(realm.objects(class))
প্রথম ফানক যদি কাজ না করে থাকে তবে আপনি এটি ব্যবহার করে দেখতে পারেন:
var refrenceBook:[RefrenceProtocol] = []
let faceTypes = Array(realm.objects(FaceType))
refrenceBook = faceTypes.map({$0 as FaceType})
আমি নিশ্চিত নই, এটি করার জন্য যদি কোনও কার্যকর উপায় থাকে তবে।
তবে আপনি এটি একটি সুইফ্ট অ্যারে তৈরি করে লুপে যুক্ত করতে পারেন।
class func getSomeObject() -> [SomeObject]? {
var someObjects: [SomeObject] = []
let objects = Realm().objects(SomeObject)
for object in objects{
someObjects += [object]
}
return objects.count > 0 ? someObjects : nil
}
আপনি যদি এটি খুব ধীর বোধ করেন। আমি আপনাকে Results
সরাসরি রিয়েল অবজেক্টের আশেপাশে যাওয়ার পরামর্শ দিচ্ছি ।
extension Results {
func materialize() -> [Element] {
return Array(self)
}
}