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


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পরিবর্তে ফেরত দেয় LazyBidirectionalCollectionArrayটাইপ জানেন এই বিমূর্ত সংগ্রহ ধরনের ব্যবহার নিজেই ইনিশিয়ালাইজ কিভাবে:

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.