সুইফট ডিকশনারি: অ্যারে হিসাবে মান পান


150

আমার কাছে একটি UIColorএনাম মান দ্বারা হ্যাশ হওয়া অবজেক্টযুক্ত একটি অভিধান রয়েছে ColorScheme:

var colorsForColorScheme: [ColorScheme : UIColor] = ...

আমি এই অভিধানটি অন্তর্ভুক্ত সমস্ত রঙের (মানগুলি) একটি অ্যারে বের করতে সক্ষম হতে চাই। আমি ভেবেছিলাম আমি valuesসম্পত্তিটি ব্যবহার করতে পারি , যেমন অভিধানের মানগুলি ( for value in dictionary.values {...}) এর পুনরাবৃত্তি করার সময় ব্যবহৃত হয় তবে এটি ত্রুটি প্রদান করে:

let colors: [UIColor] = colorsForColorSchemes.values
                        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'

দেখে মনে Arrayহচ্ছে মানগুলির একটি ফেরত দেওয়ার পরিবর্তে valuesপদ্ধতিটি আরও বিমূর্ত সংগ্রহের ধরণ দেয়। Arrayঅভিধানের মানগুলিকে একটি for-inলুপে না বের করে কী কী কোনও যুক্ত করার উপায় আছে ?


1
সুইফ্ট 5: colorsForColorSchemes.values
— হুয়ান বোয়েরো

উত্তর:


284

সুইফট ২.০ হিসাবে, Dictionaryএর valuesসম্পত্তি এখন a এর LazyMapCollectionপরিবর্তে ফেরত দেয় LazyBidirectionalCollection। Arrayটাইপ জানেন এই বিমূর্ত সংগ্রহ ধরনের ব্যবহার নিজেই ইনিশিয়ালাইজ কিভাবে:

let colors = Array(colorsForColorSchemes.values)

সুইফটের ধরণের অনুমিতি ইতিমধ্যে জানে যে এই মানগুলি UIColorঅবজেক্টস, সুতরাং কোনও ধরণের কাস্টিং প্রয়োজন হয় না, যা দুর্দান্ত!


1
আপনি এটিকে টাইপ করা সামগ্রীর সাথে অ্যারে হিসাবেও কাস্ট করতে পারেন। দুর্দান্ত কাজ! ধন্যবাদ যাক রং = [কাস্টমকালারঅবজেক্ট] (রঙের জন্য রঙচর্চা.মূল্য)
— বলনাদ

6
দেখে মনে হচ্ছে সুইফট ২.০-তে, অভিধান val দুর্ভাগ্যক্রমে, .array একটি অলস্যা ম্যাপকলেকশনে সংজ্ঞায়িত হয়নি। যাইহোক, অ্যারে (অভিধান.মূল্যগুলি) উপায় এখনও ঠিক কাজ করে কারণ অ্যারে প্রকারগুলি কীভাবে নিজেকে একটি লাজিম্যাপক্লেশন থেকে সূচনা করতে হয় তা জানে।
— টড কানিংহাম

8
মনে রাখবেন যে মানগুলির ক্রমটি অপ্রত্যাশিত হতে পারে। উদাহরণস্বরূপ [0: "small", 1: "medium", 2: "large"]সম্ভবত উত্পন্ন হবে না["small", "medium", "large"]
— সাইমন বেনগসটস

55

আপনি মূল্যবোধের একটি অ্যারে অভিধান ম্যাপ করতে পারেন:

let colors = colorsForColorScheme.map { $0.1 }

সমাপ্তি অভিধান থেকে মূল-মান টিপল নেয় এবং কেবল একটি মান দেয়। সুতরাং, মানচিত্রের ফাংশনটি মানের একটি অ্যারে তৈরি করে।

একই কোডটির আরও পাঠযোগ্য সংস্করণ:

let colors = colorsForColorScheme.map { (scheme, color) in
    return color
}

হালনাগাদ

এক্সকোড 9.0 থেকে, অভিধান মানগুলি valuesসম্পত্তি ব্যবহার করে অ্যাক্সেস করা যায় যা Collectionপ্রোটোকলের সাথে সঙ্গতিপূর্ণ:

let colors = colorsForColorScheme.values

সাধারণত আপনি এটি একটি অ্যারে হিসাবে চান:

let colors = Array(dict.values)

এবং এটাই.


2
তবে প্রকৃতপক্ষে এটি অ্যারে পাওয়ার পঠনযোগ্য উপায় হ'ল রংগুলি = অ্যারে (রং ফরর কালারস্কিম.মূল্যগুলি)
— রেনেতিক

1
এই সমাধানটি পছন্দ করুন
— নেভি সীল

@ পিজুলেইনাস যেহেতু এটিই এখানে সেরা উত্তর, আমি কেবলমাত্র ২০২০ এর জন্য সর্বশেষে সম্পাদনা করেছি ly স্পষ্টতই আনইন্ড, এডিট ইত্যাদি! চিয়ার্স এবং ধন্যবাদ!
— ফ্যাটি


8

আপনি এতে একটি এক্সটেনশন তৈরি করতে পারেন LazyMapCollection

public extension LazyMapCollection  {

    func toArray() -> [Element]{
        return Array(self)
    }
}

colorsForColorSchemes.values.toArray() অথবা colorsForColorSchemes.keys.toArray()


3

প্রথমত, নীচের বিবৃতি থেকে মনে হয় আপনার ভেরিয়েবল (অভিধান) নাম colorsForColorScheme

var colorsForColorScheme: [ColorScheme : UIColor] = ... 

আপনি colorsForColorSchemesযখন ডিকশনারি থেকে মানগুলি পাওয়ার চেষ্টা করছেন যখন আপনি করেছেন-

let colors: [UIColor] = colorsForColorSchemes.values

যা আপনাকে একটি সংকলন সময় ত্রুটি দেয়। যাইহোক আমি ধরে নিচ্ছি যে আপনার টাইপো ছিল এবং আপনার অভিধানের নাম colorsForColorSchemes। সুতরাং, এখানে সমাধান-

পূর্বে উল্লিখিত হিসাবে, সুইফটে অনুমান সম্পত্তি প্রকারের কারণে, আপনার কোডটি অনুমান করতে পারে যে .valuesফাংশন থেকে প্রত্যাবর্তিত প্রকারটি ইউআইক্লোরের অ্যারে ফিরিয়ে দিচ্ছে । যাইহোক, সুইফট টাইপ-নিরাপদ হতে চায়, সুতরাং যখন আপনি colorsঅ্যারেতে মানগুলি সঞ্চয় করেন , আপনাকে স্পষ্টভাবে এটি সংজ্ঞায়িত করতে হবে। দ্রুত এবং 5 এর উপরে, এখন আপনি কেবল নিম্নলিখিতগুলি করতে পারেন -

let colors = [UIColor](colorsForColorSchemes.values)

0

আমি এটি সুইফট 5 এ সর্বাধিক দরকারী বলে মনে করেছি:

colorsForColorSchemes.allValues

দস্তাবেজগুলি দেখুন - https://developer.apple.com/docamentation/foundation/nsd शब्दको/1408915- সর্বমোট মূল্য


2
এটি কেবল এনএস অভিধানের জন্য। এটা সহজ d.values। অনুশীলনেArray(d.values)
— ফ্যাটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.