রিয়েলমসুইফ্ট: ফলাফলগুলি সুইফ্ট অ্যারেতে রূপান্তর করুন


143

আমি যা বাস্তবায়ন করতে চাই:

class func getSomeObject() -> [SomeObject]? {
    let objects = Realm().objects(SomeObject)

    return objects.count > 0 ? objects : nil
}

[SomeObject]পরিবর্তে আমি কীভাবে বস্তুটি ফিরতে পারি Results?

উত্তর:


379

অদ্ভুত, উত্তরটি খুব সোজা সামনে। এখানে আমি এটি কীভাবে করছি:

let array = Array(results) // la fin

এটি কোনও এনএসএরিকে ফেরত দেয় না?
থিমস্মাইন সিজন

2
@ থেমসামার্সাইন রিয়েলম সম্প্রতি পরিবর্তন হয়েছে, তবে একটি বিষয় নিশ্চিত: উপরের কোডটি Arrayফলাফল পুনরুক্তিকারী দ্বারা নির্মিত একটি সুইফ্ট প্রদান করে ।
মাজিওদ

4
এটি সত্তার শূন্যস্থান ফিরে (প্রাথমিক)
নিক কোভ

2
(আমি @NikKov সাথে একমত, এটা শূন্য ফিরে করা সত্তার Vars বলে মনে হয়
জন

2
@ জন আপনি কীভাবে দেখছেন যে তারা শূন্য? দেখে মনে হচ্ছে যেহেতু তারা অলস, যখন আপনি কোনও ডিবাগ পয়েন্টে থামার দিকে তাকান তারা খালি দেখা দেয় তবে আপনি যদি এটি মুদ্রণ করেন তবে এটি তাদের অ্যাক্সেস করে এবং সঠিক মানটি (আমার জন্য) দেখায়।
যেরেমিয়া

31

যদি আপনাকে অবশ্যই একে একে রূপান্তর করতে Resultsহয় তবে Arrayমনে রাখবেন একটি কর্মক্ষমতা এবং স্মৃতি ওভারহেড, যেহেতু Resultsঅলস। তবে আপনি এটি এক লাইনে করতে পারবেন, যেমন results.map { $0 }সুইফট ২.০ (বা map(results) { $0 }1.2 তে)।


রাজ্যের কোন সংস্করণ?
সাহিল কাপুর

31
আপনি যদি আপনার প্রকল্পের অনেক শ্রেণিতে রিয়েলমের উপর নির্ভরতা ফাঁস করতে না চান তবে এই রূপান্তরটি কী প্রয়োজনীয়তা নয়?
মার্সিন কুটিল

15
map { $0 }LazyMapRandomAccessCollectionসুইফ্ট 3 এ ফিরে আসবে , সুতরাং @ ম্যাসিওডের উত্তর আরও ভাল।
লেগোলেস

@ মার্সিনকুপটেল হ্যাঁ এটিই আমার কাছে পাওয়া সমস্যা। আমি একটি প্রোটোকলের সাথে সঙ্গতিপূর্ণ এমন একটি কাঠামো তৈরি করে জগতের মডেলটিকে বিমূর্ত করতে সক্ষম হয়েছি এবং এটি আমার কোডবেজে আমার স্বাক্ষরগুলিতে সংজ্ঞায়িত করা প্রোটোকলের বিমূর্ততা raction তবে মাঝে মাঝে আমাকে একটি অ্যারেতে রূপান্তর করতে হবে, আমার বিমূর্ত প্রোটোকলের একটি অলস সংগ্রহ থাকতে পারে যাতে এটি কেবল অ্যাক্সেসের সময় কাঠামোর সাথে রূপান্তর করে?
পাভান

20

আমি একটি সমাধান খুঁজে পেয়েছি। ফলাফলগুলিতে এক্সটেনশন তৈরি করা হয়েছে।

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
}

4
for var i = 0; i < count; i++ for i in 0 ..< count
সাল

1
উপরেরটি এক্সটেনশনটি লেখার খুব বিভ্রান্তিকর পদ্ধতি: এক্সটেনশনের ফলাফল {ভের অ্যারে: [উপাদান] {ফিরুন স্ব.ম্যাপ {$ 0}}}
গিলস

10

সুইফট ৪.২ দিয়ে এটি এক্সটেনশনের মতোই সহজ:

extension Results {
    func toArray() -> [Element] {
      return compactMap {
        $0
      }
    }
 }

সমস্ত প্রয়োজনীয় জেনেরিক তথ্য ইতিমধ্যে একটি অংশ Resultsযা আমরা প্রসারিত করি।


8

এটি একটি একক লাইনে সুইফট 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 }
    }
}

আমি যেমন এই কোডটি XCode এর 9.2 সংস্করণে ব্যবহার করছি, এটি আমাকে অঘোষিত ধরণের 'টি' এর ব্যবহার দেখায়
ভাবেশ ধাদুক

আমার উত্তর আপডেট করেছেন, আপনি এটি পরীক্ষা করতে পারেন।
আবদুল্লাহসেলেক

এক্সকোড 10 এবং উপরে আপনি সতর্কতা এড়ানোর জন্য ফ্ল্যাটম্যাপের পরিবর্তে কমপ্যাক্ট ম্যাপ ব্যবহার করতে পারেন।
মেটোডিজ জেড্রাভকিন

6

সুইফট 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
}

4

ফলাফলগুলি অ্যারিতে রূপান্তর করা ভাল ধারণা নয়, কারণ ফলাফল অলস। তবে আপনার যদি প্রয়োজন হয় তবে:

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})

RealmSwift 3.4.0 এ আপডেট করার পরে, তালিকাটি আর্গুমেন্ট নেয় না। এই ক্ষেত্রে অ্যারে কীভাবে তালিকায় রূপান্তর করবেন? কোন ধারণা?
নিশু_প্রিয়া

1
@ নিশুপ্রিয়া এখানে আপনাকে মাইলিস্ট = তালিকা <পার্সন> () মাইলিস্ট.অ্যাপেন্ড (অবজেক্টস ইন: রিয়েলম.অবজেক্টস (পার্সন.সেল্ফ))
নসভ পাভেল

2

আমি নিশ্চিত নই, এটি করার জন্য যদি কোনও কার্যকর উপায় থাকে তবে।

তবে আপনি এটি একটি সুইফ্ট অ্যারে তৈরি করে লুপে যুক্ত করতে পারেন।

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সরাসরি রিয়েল অবজেক্টের আশেপাশে যাওয়ার পরামর্শ দিচ্ছি ।


আমি কেবল এর পরিবর্তে রেজুলেসগুলিতে একটি এক্সটেনশন তৈরি করে এর মতো কিছু করেছি। আমি উত্তর হিসাবে কোড পোস্ট করেছি। ধন্যবাদ :)
সাহিল কাপুর

হাঁ। আমি এটাও করতাম
n রৈনিক

2
extension Results {
    var array: [Element]? {
        return self.count > 0 ? self.map { $0 } : nil
    }
}

সুতরাং, আপনি যেমন ব্যবহার করতে পারেন:

Realm().objects(SomeClass.self).filter("someKey ENDSWITH %@", "sth").array

2

সুইফট 4, ক্ষেত্রের জন্য সমাধান 3

extension Results {
    func toArray<T>(ofType: T.Type) -> [T] {
        let array = Array(self) as! [T]
        return array
    }
}

এখন রূপান্তর নীচের মত করা যেতে পারে

let array = Realm().objects(SomeClass).toArray(ofType: SomeClass.self)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.