کارایی مجموعه ی ست در سویفت چیست
تعریف مجموعه ها در سویفت
سویفت سه نوع مجموعه در اختیار کاربران قرار میدهد که عبارتند از آرایه ها ، ست ها و دیکشنری ها و برای گرداوری مجموعه ای از داده ها از این سه نوع مجموعه استفاده میشود. آرایه ها مجموعه منظمی از داده ها هستند . ست ها مجموعه نامنظمی از داده های خاص هستند. دیکشنری ها مجموعه ی بی نظمی از ارتباط کلید ها با مقادیر میباشند، در واقع دیکشنری ها مجموعه ای از واژهها و کلیدهای وابسته هستند.
آرایه ها ، ست ها و دیکشنری ها در سویفت همواره نوع داده و کلید های که میتوانند ذخیره کنند را مشخص می کنند . این به آن معنا است که نمیتوانید یک مقدار غلط را درون یک مجموع قرار دهید . این موضوع در ضمن باعث میشود شما درباره نوع داده ارجاعی از مجموعه ها همواره مطمئن باشید.
نکته :
آرایه ها و ست و دیکشنری در سویفت بعنوان مجموعه های عمومی شناخته میشوند. مجموعه های عمومی دیگری هم وجود دارد که در این مبحث نمی گنجد .
تغییر پذیری مجموعه ها
اگر شما یک آرایه ، یک ست، یا یک دیکشنری ایجاد کردید و آن را به متغییری متصل نموده اید . مجموعه ای که ایجاد کرده اید قابل ویرایش خواهد بود. معنای این جمله این است که شما میتوانید مجموعه را بعد از ایجاد تغییرداده و یا ویرایش کنید. اینکار میتواند با افزودن، حذف کردن یا تغییر دادن آیتم های مجموعه انجام شود. اگر شما یک آرایه، یک ست یا یک دیکشنری را درون یک ثابت بریزید ، آن مجموعه غیر قابل تغییر خواهد بود و اندازه و محتوای مجموعه را دیگر نمی توان تغییر داد.
نکته:
اینکار تمرین خوبی است که در جای که نیازی به تغییر ندارید یک مجموعه تغییر ناپذیر ایجاد کنید . انجام اینکار فهم کد را ساده تر کرده و کمپایلر سویفت راحتتر میتواند مجموعه ایجاد شده را پردازش کند.
آرایه ها
ما در باره آرایه ها در مقاله نحوه تعریف آرایه ها در سویفت به تفسیر صحبت کردیم. یک آرایه مقادیری را از یک نوع، در یک لیست منظم ذخیره می کند. یک مقدار میتواند به دفعات در مکان های مختلف یک آرایه ظاهر شود.
ست ها Sets :
یک ست ارزش و مقادیر هر نوع داده را، در مجموعه ای ، بدون نظم خاصی ذخیره می کند. اگر چیدمان عناصر اهمیتی ندارد و یا اینکه نمی خواهید یک عنصر بیش از یکبار در آرایه بکار رود ، میتوانید از یک ست بجای یک آرایه استفاده کنید .
نکته :
انواع ست در سویفت با ساختار کلاس NSSet
مقادیر برای انواع ست ها باید Hash باشند
یک نوع باید hashable باشد که در یک ست قابل ذخیره شدن باشد .نوع داده باید راهی برای پردازش مقدار hash value برای خود بیابد . یک مقدار هاش یک مقدار صحیح است که برای تمام اشیاء در هنگام مقایسه یک مقدار ثابت به خود میگیرد مثال اگر a == b باشد در نتیجه a.hashValue == b.hashValue برابر است.
همه مقادیر پایه برای سویفت (مانند String, Int, Double, وBool) در حالت پیشفرض hashable هستند و شما میتوانید آنها را در ست ها و کلید دیکشنری ها استفاده کنید. مقادیر Enumeration case در صورتی که مقداری به آنها داده نشده باشد در حالت پیشفرض hashable هستند.
نکته :
شما میتوانید از انواع داده های سفارشی به عنوان یک نوع مقدار ست و یا انواع کلید دیکشنری استفاده کنید. برای اینکار باید داده های خود را در کتابخانه سویفت طبق پروتکل Hashable سویفت تعریف کنید. به این مثالها نگاه کنید
- a == a (Reflexivity)
- a == b implies b == a (Symmetry)
- a == b && b == c implies a == c (Transitivity)
هر پروتکل Hashable مقدار صحیحی به نام hashValue را دریافت می کند. از آنجا که پرتکل Hashable دارای پرتکل تساوی است باید درون آن از علامت == استفاده شود. که در مثال بالا انواع این تساوی را می بینید.
کد ست در سویفت
انواع ست در سویفت بصورت Set<Element> تعریف می شوند، اگر Element ها از نوعی باشند که ست اجازه ذخیره ی آنها را داشته باشد ذخیره میگردند. بر خلاف آرایه ها ست ها حالت shorthand ندارند.
ایجاد و آغاز یک ست تهی
شما میتوانید یک ست تهی از یک از یک نوع مشخص با استفاده از دستورات زیر ایجاد کنید:
- var letters = Set<Character>()
- print("letters is of type Set<Character> with \(letters.count) items.")
- // Prints "letters is of type Set<Character> with 0 items."
نکته
نوع متغییر letters به صورت Set<Character> بعنوان بخش آغازگر کد به نمایش در میآید.
اگر به به یک متغییر نوعی عدد بدهید و بعد آن متغییر را به یک سِت تهی تبدیل کنید. نوع متغییر به سِت تغییر میکند. در این حالت سِت آن متغییر، داده ها را با همان نوع داده اولیه متغییر دریافت می کند . مثال زیر را نگاه کنید:
- letters.insert("a")
- // letters now contains 1 value of type Character
- letters = []
- // letters is now an empty set, but is still of type Set<Character>
ایجاد سِت با استفاده از آرایه ها
یکی از روش های سریع مقدار دهی به یک سِت استفاده از آرایه ها است . یادتان باشد که آرایه باید از قوانین سِت پیروی کند و مثلا داده تکراری نداشته باشد.
در مثال زیر ما یک سِت به نام favoriteGenres ایجاد کرده و داده های رشته ای را در آن ذخیره کرده ایم:
- var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
- // favoriteGenres has been initialized with three initial items
متغیر favoriteGenres به صورت یک سِت با مقادیر رشته ای تعریف شده است. اینکار با دستور Set<String> انجام میشود. از آنجا که نوع سِت ما رشته ای تعیین شده تنها میتوانیم داده های رشته ای در آن قرار دهیم . در مثال بالا ما اینکار را با آرایه ای رشته ای انجام داده و مقادیر "Rock", "Classical", "Hip hop" را درون این سِت قرار داده ایم .
نکته:
ست favoriteGenres به عنوان یک متغییر تعریف میشود یعنی توسط Var و نه بصورت ثابت که برای تعریف آن از let استفاده می کردیم. در مقاله تعریف رشته ها در Swift در باره تفاوت این دو نوع صحبت کرده ایم.
شما میتونید نوع سِت را تعریف نکنید. ولی باید یادتان باشد که سِت شما از نوع داده های آرایه خواهد شد و اگر بخواهید به این سِت یک عضو دیگر اضافه کنید، باید از همان نوع داده های آرایه باشد.
- var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]
از آنجا که همه مقادیر درون آرایه باید از یک نوع باشد ، سویفت میتواند دستور Set<String> را اجرا کند و مقدار درست را به سِت favoriteGenres بدهد.
دسترسی و تغییر در یک سِت
تعداد اعضای ست
شما میتوانید با متد هایی به محتوای سِت دسترسی و آنرا تغییر دهید، برای دیدن تعداد آیتم های سِت از دستور Count استفاده کنید:
- print("I have \(favoriteGenres.count) favorite music genres.")
- // Prints "I have 3 favorite music genres."
کنترل خالی بودن ست:
از دستور isEmpty برای چک خالی بودن سِت استفاده کنید در واقع این دستور چک می کند که count برابر صفر است :
- if favoriteGenres.isEmpty {
- print("As far as music goes, I'm not picky.")
- } else {
- print("I have particular music preferences.")
- }
- // Prints "I have particular music preferences."
افزودن مقدار به سِت
شما میتوانید با استفاده از متد insert(_:) به سِت یک داده اضافه کنید:
(نکته مترجم: یادتان باشد که مقدار اضافه شده از نوع مورد تائید سِت باشد. در غیر این صورت با پیام خطا مواجع میشوید. )
- favoriteGenres.insert("Jazz")
- // favoriteGenres now contains 4 items
حذف عناصر از سِت
برای حذف عناصر از سِت میتوانید از متد remove(_:) استفاده کنید، این دستور تنها در صورتی که عنصر جزئی از سِت باشد آنرا حذف می کند. یادتان باشد که سویفت به حروف بزرگ و کوچک حساس است. اگر عنصر مد نظر در سِت باشد مقدار آن را ارجاع داده و اگر این عنصر در سِت موجود نباشد مقدار Nil را باز میگرداند. اگر بخواهید همه عناصر سِت را حذف کنید از متد removeAll() استفاده کنید.
- if let removedGenre = favoriteGenres.remove("Rock") {
- print("\(removedGenre)? I'm over it.")
- } else {
- print("I never much cared for that.")
- }
- // Prints "Rock? I'm over it."
کنترل وجود عنصر در سِت
برای کنترل وجود یک آیتم خاص در سِت از متد contains(_:) استفاده کنید.
(نکته هنگامی که از متد بصورت methodname(_:) استفاده می کنیم وجود آروگومان اجباری است)
- if favoriteGenres.contains("Funk") {
- print("I get up on the good foot.")
- } else {
- print("It's too funky in here.")
- }
- // Prints "It's too funky in here."
پرینت کردن تمام داده ها در سِت
برای اینکه تمام داده های یک سِت را پرینت کنیم، میتوانیم از حلقه for-in استفاده کنیم:
- for genre in favoriteGenres {
- print("\(genre)")
- }
- // Jazz
- // Hip hop
- // Classical
مرتب کردن داده های یک سِت:
ست ها در سویفت مرتب شده نیستند. برای اینکه دادههای یک سِت در سویفت را بصورت مرتب فراخوانی کنیم، باید از متد sorted() استفاده کنیم:
- for genre in favoriteGenres.sorted() {
- print("\(genre)")
- }
- // Classical
- // Hip hop
- // Jazz
انواع عملگر ها در سِت
شما میوانید دو سِت را باهم ترکیب کنید. عناصر مشترک در دو سِت را تشخیص دهید ، میزان اشتراکات دو سِت را بیابید. و متوجه شوید که آیا تمام عناصر دو سِت مانند هم هستند ، برخی عناصر دو سِت شبیه به هم هستند و یا بین دو سِت هیچ نقطه اشتراکی ندارند.
اصول عملگرهای سِت
برای اینکه عملگرهای ممکن بین دو سِت را درک کنید، ما تصاویر زیر را ایجاد کرده ایم که عملگرهای ممکن بین دو سِت a و b را نشان میدهند. قسمت های تیره نشاندهنده عملگر سِت میباشد:
- از متد intersection(_:) برای ساخت یک سِت جدید از مقادیر موجود در هر دو سِت استفاده کنید.
- از متد symmetricDifference(_:) برای ساخت یک سِت جدید از عناصر غیر مشترک دو سِت استفاده کنید
- از متد union(_:) برای ایجاد یک سِت شامل تمام مقادیر موجود در هر دو سِت استفاده کنید (مجموع دو سِت )
- از متد subtracting(_:) برای ایجاد یک سِت از داده های که در یکی از دو سِت وجود ندارد استفاده کنید.(تفریق دو سِت)
- let oddDigits: Set = [1, 3, 5, 7, 9]
- let evenDigits: Set = [0, 2, 4, 6, 8]
- let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
-
- oddDigits.union(evenDigits).sorted()
- // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- oddDigits.intersection(evenDigits).sorted()
- // []
- oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
- // [1, 9]
- oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
- // [1, 2, 9]
عضویت و تساوی در سِت
در تصویر زیر سه سِت a,b,c را قرار دادیم که باهمدیگر همپوشانی دارند . به نسبت سِت a و سِت b نگاه کنید. ست a نسبت به سِت b بعنوان یک superset است زیرا که تمام داده های سِت b درون سِت a موجود هستند.
نسبت سِت b به سِت a به عنوان subset شناخته میشود .
نسبت ست b و ست c بصورت disjoint است و این دو ست هیچ اشتراکی باهم ندارند.
- از علامت مساوی با عملگر (==) برای مشخص کردن دو سِت که همه عناصرشان باهم یکی است استفاده کنید.
- از متد isSubset(of:) برای مشخص کردن اینکه تمام داده های یک سِت درون یک سِت دیگر قرار دارد استفاده کنید.
- از متد isSuperset(of:) برای مشخص کردن اینکه قسمتی از داده های ست تمام داده های ست دیگر را تشکیل میدهند استفاده کنید.
· از متد isDisjoint(with:) برای مشخص کردن اینکه برخی داده های دو ست با هم اشتراک دارند استفاده کنید.
- let houseAnimals: Set = [, ]
- let farmAnimals: Set = [ , , ,, ]
- let cityAnimals: Set = [, ]
-
- houseAnimals.isSubset(of: farmAnimals)
- // true
- farmAnimals.isSuperset(of: houseAnimals)
- // true
- farmAnimals.isDisjoint(with: cityAnimals)
- // true
شرکت برنامه نویسی سارگون مجری تخصصی برنامه نویسی IOS آمادگی تولید نرم افزارهای تخصصی و کاربردی برای فروشگاه ها و شرکت ها را دارد.