برنامه نویسی

سوئیفت 101: مجموعه ها قسمت اول – آرایه ها

به مقاله جدیدی از سری یادداشت های Swift 101 خوش آمدید 📝 من در حین یادگیری زبان انجام دادم و تصمیم گرفتم آنها را به اشتراک بگذارم چرا که نه؟.

اگر به تازگی با سوئیفت آشنا شده اید یا علاقه مند به یادگیری بیشتر در مورد این زبان هستید، از شما دعوت می کنم سری من را دنبال کنید! 🙊

در این فصل، قسمت اول مجموعه‌ها و انواع مجموعه‌ها را به اشتراک می‌گذارم، جایی که به آرایه‌ها می‌پردازیم.


چند هفته پیش، در مورد ثابت‌ها و متغیرها بحث کردیم که مقادیری را برای استفاده در کد و برخی از انواع ساده ذخیره می‌کنند. با این حال، انواع پیچیده دیگری نیز وجود دارد که ما در برنامه های خود خواهیم یافت.

همانطور که قبلاً ممکن است حدس بزنید، “Collections” انواعی هستند که مقادیر زیادی را ذخیره می کنند. آنها همه این مقادیر را به روش های خاصی ترتیب می دهند تا بتوانیم در آینده به آنها دسترسی داشته باشیم.

آن را مانند یک سبد میوه با میوه های زیادی در نظر بگیرید. به طور مشابه، آرایه‌ها در سوئیفت مقادیر متعددی از یک نوع را در یک لیست مرتب ذخیره می‌کنند، مانند خطی از سیب، پرتقال و موز که به‌خوبی در سبد شما چیده شده‌اند.


آرایه ها

آرایه ها هستند مجموعه ای منظم از ارزش ها و رایج ترین نوع مجموعه هستند. در داخل یک آرایه، ممکن است هر نوع عنصری از همان نوع را ذخیره کنیم.

آرایه ها به دلیل سادگی و کارایی یکی از پرکاربردترین انواع مجموعه در سوئیفت هستند. آرایه ها یک لیست مرتب از عناصر را حفظ می کنند. این آنها را برای سناریوهایی ایده آل می کند که ترتیب عناصر مهم است، مانند لیست آیتم ها یا دنباله ای از کارها.

برای ایجاد یک آرایه، عناصر را با کاما جدا می کنیم و آنها را در پرانتز می بندیم.

let intArray = [1, 2, 3]
let stringArray = ["Mónica", "Rachel", "Phoebe"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


در حال تایپ آرایه های ما

مانند همه چیز در سوئیفت، آرایه ها نیز تایپ می شوند. اگر به صراحت به آن اشاره نکنیم، سوئیفت نوع را برای ما استنباط می کند.

با این حال، برای اینکه سوئیفت بتواند نوع را استنباط کند، مقادیر داخل آرایه باید همگن باشند، یعنی همه مقادیر باید از یک نوع باشند. به این می گویند حروف آرایه.

اگر آرایه خود را تایپ نکنیم و مقادیر ناهمگن باشند، با خطای ❌​ مواجه می شویم و سوئیفت از ما می خواهد که یک نوع صریح اضافه کنیم تا اطمینان حاصل شود که انواع مختلط عمدی هستند.

برای تنظیم یک نوع در یک آرایه، باید آن را بعد از نامگذاری نشان دهیم، همانطور که در متغیرها و ثابت های ساده انجام می دهیم.

اگر بخواهیم یک آرایه ناهمگن ایجاد کنیم یا نمی دانیم چه نوع مقادیری را در آن متغیر نگه داریم، می توانیم Any نوع –توصیه نمی شود

تایپ قوی در سوئیفت تضمین می کند که هر آرایه فقط می تواند حاوی عناصر یک نوع خاص باشد.

این می تواند از بسیاری از خطاهای رایج برنامه نویسی جلوگیری کند و کد شما را قابل پیش بینی تر و رفع اشکال کند. با تعیین نوع عناصر سوئیفت همچنین می تواند عملکرد را بهینه کند و بررسی های زمان کامپایل بهتری را ارائه دهد.

// All values are the same type
let homogenousArray: [Double] = [1.4, 2.6, 3.7]
let alsoHomogenousArray: [String] = ["Pippin", "Merry", "Frodo", "Sam"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


// Values types may be different so type is Any
let heterogenousArray: [Any] = [8, "Kobe Bryant", 24.8]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


کلاس ها و ساختارها به عنوان انواع

تا به حال ما از رایج ترین انواع برای تایپ تمام مقادیر خود استفاده کرده ایم. با این حال، در حالی که با برنامه‌های ما سروکار داریم، به خصوص اگر با API یا داده‌های پیچیده تعامل داشته باشند، ممکن است نیاز به مدیریت آرایه‌هایی با انواع ناهمگن داشته باشیم.

اگر به عقب برگردید، گفتم که می توانیم استفاده کنیم Any به عنوان یک نوع، اما من همچنین گفتم که واقعاً ایده خوبی نیست🙅🏽‍♀️​. اما اگر سوئیفت این گزینه را به ما می دهد، چرا ایده خوبی نیست؟

تایپ کردن کد ما را قابل اعتمادتر و ایمن تر می کند🛟​. ما همیشه می دانیم که چه نوع مقداری را در آن متغیر می یابیم. با Any ما این مزیت را از دست می دهیم همچنین ممکن است مشکلاتی در کامپایل ایجاد کنیم، کد خود را بیش از حد پیچیده کنیم و غیره.

اما ما می‌توانیم با استفاده از کلاس‌ها یا ساختارها به‌عنوان انواع بر این مشکل غلبه کنیم.

بیایید تصور کنیم که ما یک خبرنامه داریم و به آرایه ای با نام کاربری، ایمیل و تاییدیه ای نیاز داریم که می خواهد یک ایمیل دریافت کند. و ما قصد داریم آن را در یک آرایه ذخیره کنیم. بنابراین ابتدا می‌توانیم یک ساختار ایجاد کنیم و سپس آن را به عنوان یک نوع اختصاص دهیم.

struct User: Identifiable, Hashable {
    let id: Int
    let name: String
    let email: String
    let permission: Bool
}
var registeredUsers: [User]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در سوئیفت، ساختارها و کلاس‌ها هر دو برای ایجاد انواع داده‌های پیچیده استفاده می‌شوند، اما تفاوت‌های کلیدی دارند. ساختارها انواع مقادیر هستند، به این معنی که وقتی به یک متغیر یا ثابت جدید تخصیص داده می شوند یا به یک تابع منتقل می شوند، کپی می شوند.

از طرف دیگر، کلاس‌ها انواع مرجع هستند، بنابراین با مرجع منتقل می‌شوند و می‌توانند ارثی داشته باشند.

به طور کلی، استفاده از ساختارها برای انواع داده‌های ساده‌تر که به وراثت نیاز ندارند و کلاس‌ها برای انواع پیچیده‌تر که از وراثت بهره می‌برند، ایده بهتری است.

✨جزئیات بیشتر در مورد کلاس‌ها و ساختارها بعداً در این مجموعه ارائه خواهد شد، بنابراین فراموش نکنید که من را دنبال کنید و مراقب به‌روزرسانی‌های جدید باشید.✨​


مدیریت آرایه: دسترسی به مقادیر و روش ها

دسترسی به مقادیر آرایه

اکنون می دانیم که یک آرایه به عنوان یک مجموعه، می تواند یک یا چند مقدار را ذخیره کند، اما برای استفاده از آنها احتمالاً به جداسازی آنها نیاز داریم و برای انجام این کار باید به آن مقادیر دسترسی داشته باشیم.

با استفاده از شاخص ارزش

یکی از راه های دسترسی به مقادیر آرایه، فراخوانی شاخص است. همانطور که آرایه ها هستند مجموعه های سفارش داده شده اگر هیچ چیز به صراحت تغییر نکند، مقدار در یک موقعیت خاص همیشه یکسان خواهد بود.

let hatchNumbers = [4, 8, 15, 16, 23, 42]
let thirdHatchNumber = hatchNumbers[2]
print(thirdHatchNumber) // 15
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🧐 به یاد داشته باشید که شاخص آرایه از 0 شروع می شود. بنابراین اولین مقدار اندیس 0 و غیره است. 🧐

تکرارها یا حلقه ها: For-in و while

دو راه برای تکرار یک آرایه وجود دارد. یکی را می‌توانید در حین استفاده از SwiftUI در نماها و دیگری را در بقیه زمان‌ها استفاده کنید، اما نگران نباشید، آنها بسیار شبیه به هم هستند.

اگر می خواهید در این مورد بیشتر بدانید، مراقب این مجموعه باشید زیرا من در مورد Control Flow خواهم نوشت، اما در همین حین، ما رایج ترین آنها را در اینجا چکش می کنیم: حلقه های For-in

حلقه ها را می توان به عنوان یک مارپیچ تصور کرد، هر حلقه از مارپیچ یک آیتم است. بنابراین، وقتی یک آرایه را تکرار می کنیم، مرتباً دور آرایه حلقه می زنیم.

تصور کنید یک آرایه با نام های Fellowship of the Rings داریم و من می خواهم به نام هر یک از آنها دسترسی داشته باشم. می‌توانیم آرایه را با استفاده از a بررسی کنیم for in حلقه بزنید و مقادیر را چاپ کنید.


let fellowshipMembers = ["Frodo", "Sam", "Gandalf", "Aragorn", "Legolas", "Gimli", "Boromir", "Merry", "Pippin"]

// Access elements
for member in fellowshipMembers {
  print(member)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اتفاقی که قرار است بیفتد این است که سوئیفت هر یک از اعضای داخل را بررسی می کند fellowshipMembers آرایه و نه مقدار را چاپ خواهد کرد.

Frodo
Sam
Gandalf
Aragorn
Legolas
Gimli
Boromir
Merry
Pippin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما همچنین می توانیم تکرار را انجام دهیم اما یک بند به آن اضافه کنیم. برای انجام این کار ما باید یک را اضافه کنیم جایی که در حلقه ها

// Leave Frodo out
let fellowshipMembers = ["Frodo", "Sam", "Gandalf", "Aragorn", "Legolas", "Gimli", "Boromir", "Merry", "Pippin"]
for member in fellowshipMembers where member != "Frodo" {
  print(member)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار همه اعضای انجمن چاپ می‌شوند، اما فرودو حذف می‌شود.

راه دیگری برای انجام یک حلقه با ارزیابی یک شرط وجود دارد و آن استفاده از while است. اساساً ما از سوئیفت می‌خواهیم که در حالی که شرایطی پیش می‌آید، کاری انجام دهد.

مانند زمانی که در حال آشپزی هستید به آن فکر کنید، while آرد را می بینید، مخلوط را هم بزنید. سپس متوجه می شوید که اگر آرد دیگر قابل مشاهده نیست، می توانید هم زدن را متوقف کنید.

while condition {
  do this
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید تصور کنیم که می خواهیم به فرودو اجازه دهیم 3 چیز را جمع کند

var itemsToCollect = ["Ring", "Lembas Bread", "Elven Cloak", "Light of Eärendil", "Mithril Coat"]
var thingsCollected = 0

while thingsCollected < 3 {
    print("Frodo has collected: \(itemsToCollect[thingsCollected])")
    thingsCollected += 1
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این برای ما چاپ خواهد شد

Frodo has collected: Ring
Frodo has collected: Lembas Bread
Frodo has collected: Elven Cloak
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حالی که ما در حال حلقه زدن یک آرایه هستیم، ممکن است بخواهیم به مقدار شاخص عنصر دسترسی داشته باشیم و آن را فراخوانی کنیم enumerated() روش با آرایه برای انجام این کار، ممکن است شاخص را در حلقه فراخوانی کنیم.

// Print with index
let fellowshipMembers = ["Frodo", "Sam", "Gandalf", "Aragorn", "Legolas", "Gimli", "Boromir", "Merry", "Pippin"]
for (index, member) in fellowshipMembers.enumerated() {
  print("Member number \(index + 1): \(member)")
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این چاپ خواهد شد

Member number 1: Frodo
Member number 2: Sam
Member number 3: Gandalf
Member number 4: Aragorn
Member number 5: Legolas
Member number 6: Gimli
Member number 7: Boromir
Member number 8: Merry
Member number 9: Pippin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

🧐 به یاد داشته باشید که شاخص آرایه از 0 شروع می شود. بنابراین اولین مقدار اندیس 0 و غیره است. 🧐


روش ها و خواص آرایه

ما قبلاً می دانیم که آرایه ها چقدر اساسی هستند، آنها به ما اجازه می دهند چندین مقدار را در یک متغیر ذخیره کنیم و مدیریت مجموعه داده ها را آسان تر می کند.

اما برای اینکه واقعاً از 💪 قدرت آرایه ها استفاده کنید، درک روش ها و ویژگی های مختلفی که سوئیفت برای کار با آن ها ارائه می دهد ضروری است. و همچنین کار با آنها را بسیار ساده تر می کند.

روش ها و ویژگی های آرایه چیست؟

خواص ویژگی های یک آرایه هستند که اطلاعاتی در مورد خود آرایه ارائه می دهند. به عنوان مثال، ویژگی ها می توانند تعداد عناصر موجود در یک آرایه یا خالی بودن آرایه را به شما بگویند.

مواد و روش ها توابعی هستند که اعمالی را روی آرایه انجام می دهند. آنها می توانند به اضافه کردن، حذف یا یافتن عناصر در آرایه و انجام سایر عملیات مفید کمک کنند.

با یادگیری این روش ها و ویژگی ها، می توانید به طور موثر آرایه ها را دستکاری کنید و کد خود را کارآمدتر و خوانا کنید.

بیایید بیشترین استفاده را ببینیم:

.count

این ویژگی تعداد عناصر داخل یک آرایه را شمارش می کند.

var numbers = [1, 2, 3, 4]
print(numbers.count) 
// Output: 4
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.append()

این روش به ما اجازه می دهد تا عناصر جدیدی را به آن اضافه کنیم پایان از آرایه

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.append("Bread")
print(groceryList) 
// Output: ["Onions", "Apples", "Pasta", "Bread"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.insert()

این روش به ما این امکان را می دهد که مقادیر جدیدی را در یک شاخص خاص به آرایه اضافه کنیم.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.insert("Bread", at: 1)
print(groceryList) 
// Output: ["Onions", "Bread", "Apples", "Pasta"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.remove(at:)

این روش عنصر را در یک شاخص خاص در آرایه حذف می کند.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.remove(at: 0)
print(groceryList) 
// Output: ["Apples", "Pasta"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.removeAll()

این متد آرایه را از تمام مقادیر آن خالی می کند.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.removeAll()
print(groceryList) 
// Output: []
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.filter()

این روش، آرایه ما را فیلتر می کند. یک آرایه جدید با مقادیری که یک شرط را برآورده می کند ایجاد می کند.
به عنوان مثال، بیایید آرایه خود را فیلتر کنیم تا یک آرایه جدید با تمام مقادیر کمتر از 3 ایجاد کنیم.

var numbers = [1, 2, 3, 4]
let filtered = numbers.filter { $0 < 3 }
print(filtered) 
// Output: [1, 2]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.map()

این روش هر مقدار از آرایه را تبدیل می کند و یک آرایه جدید با مقادیر تبدیل شده برمی گرداند.

var numbers = [1, 2, 3, 4]
let mappedNumbers = numbers.map { $0 * 2 }
print(mappedNumbers) 
// Output: [2, 4, 6, 8]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.forEach()

این متد برای هر مقدار در آرایه یک عمل انجام می دهد.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.forEach { print($0) }
/* Output: 
   Onions
   Apples
   Pasta
*/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.sort(by:)

این روش مقادیر داخل آرایه را بر اساس یک شرط مرتب می کند یا دوباره مرتب می کند.

به عنوان مثال در اینجا می توانیم آنها را از کوچکتر به بالاتر مرتب کنیم.

var numbers = [10, 24, 3, 73, 5]
numbers.sort(by: { $0 < $1 })
print(numbers) 
// Output: [3, 5, 10, 24, 73]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.first

این ویژگی اولین عنصر آرایه ما را برمی گرداند.

var numbers = [3, 63, 27]
print(numbers.first) 
// Output: 3
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.last

این ویژگی آخرین عنصر آرایه را برمی گرداند.

var numbers = [3, 63, 27]
print(numbers.last) 
// Output: 27
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.removeFirst()

این روش اولین عنصر آرایه را حذف می کند.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.removeFirst()
print(groceryList) 
// Output: ["Apples", "Pasta"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.removeLast()

این روش آخرین عنصر آرایه را حذف می کند.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.removeLast()
print(groceryList) 
// Output: ["Onions", "Apples"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.firstIndex(where:)

این روش شاخص اولین مقداری را که یک شرط را برآورده می کند، برمی گرداند.

var numbers = [3, 63, 27]
let firstIndex = numbers.firstIndex(where: { $0 > 10 })
print(firstIndex!) // Output: 1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.shuffled()

این روش یک آرایه جدید با عناصر به هم ریخته برمی گرداند.

var numbers = [3, 63, 27]
let shuffled = numbers.shuffled()
print(shuffled) 
// Output: [27, 3, 63] (order will vary)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.reverse()

این روش ترتیب عناصر موجود در آرایه را معکوس می کند.

var groceryList = ["Onions", "Apples", "Pasta"]
groceryList.reverse()
print(groceryList) 
// Output: ["Pasta", "Apples", "Onions"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.allSatisfy(_:)

این متد true را اگر همه عناصر یک شرط را برآورده می کنند، در غیر این صورت نادرست است.

var numbers = [3, 63, 27]
let allGreaterThanTen = numbers.allSatisfy { $0 > 10 }
print(allGreaterThanTen) // Output: false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.contains(_:)

این روش بررسی می کند که آیا آرایه حاوی عنصر خاصی است یا خیر.

var numbers = [3, 63, 27]
let containsTwentySeven = numbers.contains(27)
print(containsTwentySeven) 
// Output: true
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

.isEmpty

این ویژگی خالی بودن آرایه را بررسی می کند و یک نتیجه بولی برمی گرداند.

var numbers = [3, 63, 27]
print(numbers.isEmpty) // Output: false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


منابع

اگر می‌خواهید یک برگه تقلب با برخی از این روش‌ها و ویژگی‌ها داشته باشید، این تصویر را ذخیره یا دانلود کنید. اگر آن را به اشتراک می گذارید لطفا نام من را حذف یا پنهان نکنید 🫶🏻​

ورق تقلب با برخی از روش ها و خواص آرایه ها

همچنین اگر می‌خواهید در مورد این موضوع بیشتر بدانید، به شدت توصیه می‌کنم اسناد و دوره‌های رسمی را در اینجا بررسی کنید


آیا می خواهید به یادگیری در مورد سوئیفت ادامه دهید؟

این یک سری کامل در سوئیفت 101 است، فصل بعدی قسمت دوم مجموعه ها خواهد بود که در آن مجموعه ها، تاپل ها و دیکشنری ها را به اشتراک خواهم گذاشت، بنابراین امیدوارم شما را در آنجا ببینم!

اگر از این کار لذت بردید، لطفا به اشتراک بگذارید، لایک کنید و نظر دهید. امیدوارم این بتواند برای کسی مفید باشد و افراد بیشتری را برای یادگیری و کدنویسی با سوئیفت ترغیب کند

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا