مسیرها
/
Swift
Swift
/
تمرین‌ها
/
دستیار سوئیفتی بابانوئل
دستیار سوئیفتی بابانوئل

دستیار سوئیفتی بابانوئل

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

مقدمه

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

برای ساختن تاپل، مقادیر جدا‌شده با کاما را داخل پرانتز قرار دهید:

let order = ("biscuits", 2.99, 3)

می‌توانید حاشیه‌نویسی نوع را هم به‌صورت صریح بنویسید:

let order: (String, Double, Int) = ("biscuits", 2.99, 3)

برای بیرون کشیدن عناصر تک‌تک از یک تاپل بی‌اسم، از نحوه‌ی نگارش اندیس صفرمبنا (.0، .1 و به همین ترتیب) استفاده کنید:

let item = order.0     // "biscuits"
let quantity = order.2 // 3

تاپل‌های دارای اسم

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

let order = (item: "biscuits", price: 2.99, quantity: 3)

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

let item = order.item         // "biscuits"
let quantity = order.quantity // 3

می‌توانید اسم عناصر را در حاشیه‌نویسی نوع هم بگنجانید:

let order: (item: String, price: Double, quantity: Int) = (item: "biscuits", price: 2.99, quantity: 3)

تغییر تاپل‌ها

اگر تاپلی به‌عنوان متغیر (var) تعریف شده باشد، می‌توانید عناصر آن را به‌روزرسانی کنید:

var order = ("biscuits", 2.99, 3)
order.0 = "cookies"
order.1 = 1.99
order.2 = 5

print(order)
// Prints ("cookies", 1.99, 5)

برگرداندن چندین مقدار

توابع Swift فقط می‌توانند یک مقدار واحد را برگردانند، اما با برگرداندن یک تاپل می‌توانید چندین مقدار را در کنار هم بسته‌بندی کنید و از یک تابع برگردانید:

func divide(_ dividend: Int, by divisor: Int) -> (quotient: Int, remainder: Int) {
    let quotient = dividend / divisor
    let remainder = dividend % divisor
    return (quotient, remainder)
}

let result = divide(14, by: 4)
print("Quotient: \(result.quotient), Remainder: \(result.remainder)")
// Prints "Quotient: 3, Remainder: 2"

تجزیه‌ی تاپل

می‌توانید مقادیر یک تاپل را به ثابت‌های جداگانه یا متغیرهای جداگانه تجزیه (باز) کنید:

let order = ("biscuits", 2.99, 3)
let (item, price, quantity) = order

print(item) // Prints "biscuits"

تجزیه‌ی تاپل در حلقه‌های for-in هم به‌صورت مستقیم کار می‌کند:

let orders = [("biscuits", 2.99, 3), ("cookies", 1.99, 5)]

for (item, price, quantity) in orders {
    print("Item: \(item), Price: \(price), Quantity: \(quantity)")
}

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

شما یک الف هستید که در بخش لجستیک بابانوئل کار می‌کنید و رئیس دو کار را برای ارتقای نرم‌افزار سیستم به شما سپرده است.

1. گرفتن اسم اسباب‌بازی

سیستم باید بتواند اسم یک اسباب‌بازی را از پایگاه داده بگیرد. پایگاه داده از تاپل‌هایی از نوع (name: String, quantity: Int) ساخته شده است.

تابع getName(_:) را پیاده‌سازی کنید؛ این تابع پارامتری می‌گیرد که یک تاپل از نوع (name: String, quantity: Int) را در خود دارد.

let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"

2. افزودن اسباب‌بازی جدید به پایگاه داده

بازار اسباب‌بازی، بازاری سریع و در حال تغییر است و اینکه چه اسباب‌بازی‌ای محبوب است، خیلی سریع عوض می‌شود. به همین دلیل، به تابعی نیاز است که یک اسباب‌بازی جدید بسازد.

تابع createToy(name:amount:) را پیاده‌سازی کنید؛ این تابع دو پارامتر می‌گیرد: name که اسم اسباب‌بازی را نگه می‌دارد و amount که تعداد اسباب‌بازی را نگه می‌دارد.

createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)

3. به‌روزرسانی تعداد یک اسباب‌بازی

الف‌های کارگاه بابانوئل مدام اسباب‌بازی بیشتری می‌سازند و بابانوئل باید تعداد هر اسباب‌بازی را پیگیری کند. برای این کار، سیستم باید بتواند تعداد یک اسباب‌بازی را در پایگاه داده به‌روزرسانی کند.

تابع updateQuantity(_:toy:Amount:) را پیاده‌سازی کنید؛ این تابع پارامترهای زیر را می‌گیرد:

  • toys که آرایه‌ای از تاپل‌های نوع (name: String, quantity: Int) را نگه می‌دارد.
  • toy که اسم اسباب‌بازی‌ای را نگه می‌دارد که باید به‌روزرسانی شود.
  • amount که تعداد جدید اسباب‌بازی را نگه می‌دارد.

می‌توانید فرض کنید که اسباب‌بازی از قبل در پایگاه داده وجود دارد و نیازی به بررسی آن نیست.

let toys = [(name: "Doll", quantity: 10), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
updateQuantity(toys, toy: "Doll", amount: 15)
// Returns [(name: "Doll", quantity: 15), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]

4. افزودن کلید دسته‌بندی به یک اسباب‌بازی

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

اما وقتی سیستم برای اولین بار پیاده‌سازی شد، کلید دسته‌بندی فراموش شد. حالا سیستم باید بتواند کلید دسته‌بندی را به یک اسباب‌بازی در پایگاه داده اضافه کند.

تابع addCategory(_:category:) را پیاده‌سازی کنید؛ این تابع پارامترهای زیر را می‌گیرد:

  • toys که آرایه‌ای از تاپل‌های نوع (name: String, quantity: Int) را نگه می‌دارد.
  • category که کلید دسته‌بندی‌ای را نگه می‌دارد که باید به اسباب‌بازی‌ها اضافه شود.

می‌توانید فرض کنید که اسباب‌بازی از قبل در پایگاه داده وجود دارد و نیازی به بررسی آن نیست. همچنین می‌توانید فرض کنید که از قبل هیچ کلید دسته‌بندی‌ای در اسباب‌بازی وجود ندارد.

let toys = [(name: "Car", quantity: 5), (name: "Train", quantity: 3)]
addCategory(toys, category: "Vehicle")
// Returns [(name: "Car", quantity: 5, category: "Vehicle"), (name: "Train", quantity: 3, category: "Vehicle")]
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Swift Exercism

آماده‌اید دستیار سوئیفتی بابانوئل را شروع کنید؟

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