مسیرها
/
Swift
Swift
/
تمرین‌ها
/
کارآموز جادوگری
کارآموز جادوگری

کارآموز جادوگری

تمرین یادگیری

مقدمه

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

«لیترال‌های آرایه» به‌صورت فهرستی از عناصر جدا شده با کاما نوشته می‌شوند که داخل کروشه ([...]) قرار می‌گیرند. Swift می‌تواند نوع آرایه را از روی عناصر داخل لیترال استنتاج کند.

let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]

می‌توانید نوع را به‌صورت صریح هم مشخص کنید. نوع آرایه را می‌توان به دو شکل نوشت: Array<T> یا شکل کوتاه [T]؛ در اینجا T نوع مقادیری است که آرایه در خود نگه می‌دارد.

let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]

اندازه‌ی آرایه

می‌توانید تعداد عناصر یک آرایه را با ویژگی count آن پیدا کنید:

evenInts.count
// returns 6

آرایه‌های خالی

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

let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []

آرایه‌های چندبعدی

آرایه‌ها را می‌توان تودرتو کرد تا آرایه‌های چندبعدی ساخت. وقتی نوع یک آرایه‌ی تودرتو را به‌صورت صریح مشخص می‌کنید، نوع عنصر را در کروشه‌های تودرتو قرار دهید، مانند [[Int]] یا Array<Array<Int>>:

let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

افزودن به انتهای آرایه

می‌توانید با متد append(_:) یک عنصر به انتهای یک آرایه‌ی تغییرپذیر اضافه کنید:

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]

درج در آرایه

می‌توانید با متد insert(_:at:) یک عنصر را در اندیس مشخصی درج کنید. این متد دو ورودی می‌گیرد: عنصری که باید درج شود و اندیسی که باید در آن درج شود.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]

جمع کردن آرایه‌ها با هم

می‌توانید دو آرایه را با عملگر + در یک آرایه‌ی واحد ترکیب کنید. عملگر + یک آرایه‌ی جدید می‌سازد و برمی‌گرداند؛ آرایه‌های اصلی را تغییر نمی‌دهد.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]

دسترسی به عناصر آرایه

می‌توانید به یک عنصر خاص از آرایه دسترسی پیدا کنید، به این صورت که اندیس آن را داخل کروشه ([]) پس از اسم آرایه بنویسید. اندیس‌های آرایه مقادیر Int و از صفر شروع می‌شوند؛ اندیس عنصر اول 0 است. دسترسی به اندیسی خارج از محدوده‌ی مجاز، خطای زمان اجرا می‌دهد و برنامه را از کار می‌اندازد.

let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]

evenInts[2]
// returns 6

oddInts[7]
// Fatal error: Index out of range

تغییر عناصر یک آرایه

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

var evenInts = [2, 4, 6, 8, 10, 12]

evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]

تبدیل آرایه به رشته و برگرداندن آن

می‌توانید با متد joined(separator:) آرایه‌ای از رشته‌ها را به یک رشته‌ی واحد به هم بچسبانید؛ این متد یک رشته‌ی جداکننده می‌گیرد:

let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"

می‌توانید با متد split(separator:) یک رشته را به آرایه‌ای از زیررشته‌ها تقسیم کنید و نویسه‌ی جداکننده را به آن بدهید:

let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]

حذف عناصر از یک آرایه

می‌توانید با متد remove(at:) عنصری را در اندیس معینی حذف کنید. اندیس باید داخل محدوده‌ی مجاز آرایه باشد؛ در غیر این صورت، خطای زمان اجرا رخ می‌دهد.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]

برای حذف آخرین عنصر آرایه، از متد removeLast() استفاده کنید. فراخوانی removeLast() روی یک آرایه‌ی خالی، خطای زمان اجرا می‌دهد.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]

دستورالعمل‌ها

Elyse قرار است جادوگر شود و باید چند مقدمه‌ی ساده را تمرین کند. او یک دسته کارت دارد که می‌خواهد با آن‌ها کار کند.

برای اینکه کارها کمی ساده‌تر شود، فقط از کارت‌های ۱ تا ۱۰ استفاده می‌کند، بنابراین دسته‌ی کارت‌هایش را می‌توان با یک «آرایه» از اعداد نمایش داد. موقعیت هر کارت با «اندیس» آن در آرایه متناظر است. یعنی موقعیت ۰ به کارت اول اشاره دارد، موقعیت ۱ به کارت دوم و به همین ترتیب.

Note

همه‌ی توابع باید آرایه‌ی کارت‌ها را به‌روزرسانی کنند و سپس آرایه‌ی تغییر‌یافته را برگردانند. این روشی رایج در کار است که به الگوی Builder معروف است و به شما امکان می‌دهد توابع را به‌شکلی زیبا پشت سر هم زنجیر کنید.

1. برداشتن یک کارت از دسته

برای برداشتن یک کارت، کارت موجود در اندیس position را از دسته‌ی داده‌شده برگردانید.

تابع getCard(at:from:) را پیاده‌سازی کنید که دو آرگومان می‌گیرد: at که موقعیت کارت در دسته است و from که دسته‌ی کارت‌ها است. تابع باید کارت موجود در موقعیت index را از دسته‌ی داده‌شده برگرداند.

let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4

2. تغییر یک کارت در دسته

با کمی شعبده‌بازی، کارت موجود در اندیس position را با کارت جانشینی که داده شده است عوض کنید.

تابع setCard(at:in:to) را پیاده‌سازی کنید که سه آرگومان می‌گیرد: at که موقعیت کارت در دسته است، in که دسته‌ی کارت‌ها است و to که کارت جدیدی است که جای کارت موجود در موقعیت index را می‌گیرد. تابع باید یک رونوشت از دسته برگرداند که در آن کارت موجود در موقعیت index با کارت جدید جایگزین شده است. اگر index داده‌شده اندیس معتبری در دسته نباشد، باید دسته‌ی اصلی بدون تغییر برگردانده شود.

let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]

3. درج یک کارت در بالای دسته

با درج یک کارت جدید در بالای دسته، کارتی را ظاهر کنید.

تابع insert(_:atTopOf:) را پیاده‌سازی کنید که دو آرگومان می‌گیرد: کارت جدیدی که باید درج شود و دسته‌ی کارت‌ها. تابع باید یک رونوشت از دسته برگرداند که کارت جدید داده‌شده به بالای دسته اضافه شده است.

let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]

4. حذف یک کارت از دسته

با حذف کارت موجود در position داده‌شده از دسته، کارتی را ناپدید کنید.

تابع removeCard(at:from:) را پیاده‌سازی کنید که دو آرگومان می‌گیرد: at که موقعیت کارت در دسته است و from که دسته‌ی کارت‌ها است. تابع باید رونوشتی از دسته برگرداند که کارت موجود در موقعیت index از آن حذف شده است. اگر index داده‌شده اندیس معتبری در دسته نباشد، باید دسته‌ی اصلی بدون تغییر برگردانده شود.

let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]

5. درج یک کارت در دسته

با درج یک کارت جدید در position داده‌شده در دسته، کارتی را ظاهر کنید.

تابع insert(_:at:from:) را پیاده‌سازی کنید که سه آرگومان می‌گیرد: کارت جدیدی که باید درج شود، موقعیتی که کارت جدید باید در آن درج شود و دسته‌ی کارت‌ها. تابع باید رونوشتی از دسته برگرداند که کارت جدید داده‌شده در موقعیت داده‌شده به آن اضافه شده است. اگر index داده‌شده اندیس معتبری در دسته نباشد، باید دسته‌ی اصلی بدون تغییر برگردانده شود.

let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]

6. بررسی اندازه‌ی دسته

بررسی کنید که آیا اندازه‌ی دسته با stackSize برابر است یا نه.

تابع checkSizeOfStack(_:_:) را پیاده‌سازی کنید که دو آرگومان می‌گیرد: stack که دسته‌ی کارت‌ها است و stackSize که اندازه‌ی دسته است. تابع باید اگر اندازه‌ی دسته با stackSize برابر باشد true و در غیر این صورت false برگرداند.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Swift Exercism

آماده‌اید کارآموز جادوگری را شروع کنید؟

در Exercism ثبت‌نام کنید تا Swift را همراه با 35 مفهوم116 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.