«تاپل» چندین مقدار را در یک مقدار ترکیبی واحد کنار هم میگذارد. برخلاف آرایه، مقادیر یک تاپل لازم نیست از یک نوع باشند و اندازهی تاپل پس از ساخته شدن ثابت است.
برای ساختن تاپل، مقادیر جداشده با کاما را داخل پرانتز قرار دهید:
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)")
}
شما یک الف هستید که در بخش لجستیک بابانوئل کار میکنید و رئیس دو کار را برای ارتقای نرمافزار سیستم به شما سپرده است.
سیستم باید بتواند اسم یک اسباببازی را از پایگاه داده بگیرد.
پایگاه داده از تاپلهایی از نوع (name: String, quantity: Int) ساخته شده است.
تابع getName(_:) را پیادهسازی کنید؛ این تابع پارامتری میگیرد که یک تاپل از نوع (name: String, quantity: Int) را در خود دارد.
let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"
بازار اسباببازی، بازاری سریع و در حال تغییر است و اینکه چه اسباببازیای محبوب است، خیلی سریع عوض میشود. به همین دلیل، به تابعی نیاز است که یک اسباببازی جدید بسازد.
تابع createToy(name:amount:) را پیادهسازی کنید؛ این تابع دو پارامتر میگیرد: name که اسم اسباببازی را نگه میدارد و amount که تعداد اسباببازی را نگه میدارد.
createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)
الفهای کارگاه بابانوئل مدام اسباببازی بیشتری میسازند و بابانوئل باید تعداد هر اسباببازی را پیگیری کند. برای این کار، سیستم باید بتواند تعداد یک اسباببازی را در پایگاه داده بهروزرسانی کند.
تابع 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)]
بابانوئل میخواهد بتواند اسباببازیهای پایگاه داده را دستهبندی کند. هدف این است که وقتی بابانوئل باید ارسال انجام دهد، بهراحتی اسباببازیها را پیدا کند و بتواند اسباببازیهای پایگاه داده را مرتب کند.
اما وقتی سیستم برای اولین بار پیادهسازی شد، کلید دستهبندی فراموش شد. حالا سیستم باید بتواند کلید دستهبندی را به یک اسباببازی در پایگاه داده اضافه کند.
تابع 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")]