آرایه یکی از سه نوع مجموعهی اصلی 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 قرار است جادوگر شود و باید چند مقدمهی ساده را تمرین کند. او یک دسته کارت دارد که میخواهد با آنها کار کند.
برای اینکه کارها کمی سادهتر شود، فقط از کارتهای ۱ تا ۱۰ استفاده میکند، بنابراین دستهی کارتهایش را میتوان با یک «آرایه» از اعداد نمایش داد. موقعیت هر کارت با «اندیس» آن در آرایه متناظر است. یعنی موقعیت ۰ به کارت اول اشاره دارد، موقعیت ۱ به کارت دوم و به همین ترتیب.
همهی توابع باید آرایهی کارتها را بهروزرسانی کنند و سپس آرایهی تغییریافته را برگردانند. این روشی رایج در کار است که به الگوی Builder معروف است و به شما امکان میدهد توابع را بهشکلی زیبا پشت سر هم زنجیر کنید.
برای برداشتن یک کارت، کارت موجود در اندیس position را از دستهی دادهشده برگردانید.
تابع getCard(at:from:) را پیادهسازی کنید که دو آرگومان میگیرد: at که موقعیت کارت در دسته است و from که دستهی کارتها است.
تابع باید کارت موجود در موقعیت index را از دستهی دادهشده برگرداند.
let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4
با کمی شعبدهبازی، کارت موجود در اندیس 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]
با درج یک کارت جدید در بالای دسته، کارتی را ظاهر کنید.
تابع insert(_:atTopOf:) را پیادهسازی کنید که دو آرگومان میگیرد: کارت جدیدی که باید درج شود و دستهی کارتها.
تابع باید یک رونوشت از دسته برگرداند که کارت جدید دادهشده به بالای دسته اضافه شده است.
let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]
با حذف کارت موجود در 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]
با درج یک کارت جدید در position دادهشده در دسته، کارتی را ظاهر کنید.
تابع insert(_:at:from:) را پیادهسازی کنید که سه آرگومان میگیرد: کارت جدیدی که باید درج شود، موقعیتی که کارت جدید باید در آن درج شود و دستهی کارتها.
تابع باید رونوشتی از دسته برگرداند که کارت جدید دادهشده در موقعیت دادهشده به آن اضافه شده است.
اگر index دادهشده اندیس معتبری در دسته نباشد، باید دستهی اصلی بدون تغییر برگردانده شود.
let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]
بررسی کنید که آیا اندازهی دسته با stackSize برابر است یا نه.
تابع checkSizeOfStack(_:_:) را پیادهسازی کنید که دو آرگومان میگیرد: stack که دستهی کارتها است و stackSize که اندازهی دسته است.
تابع باید اگر اندازهی دسته با stackSize برابر باشد true و در غیر این صورت false برگرداند.
let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false