سوئیفت دو دستهی اصلی از عددها را ارائه میدهد: عددهای صحیح و عددهای ممیز شناور.
0، 1، -1، 42 و -273.0.0، 3.14 و -1.36969e-10.میتوانید برای خوانایی بیشتر، در عددهای نوشتهشده در کد زیرخط بگذارید: 1_000_000 دقیقاً همان 1000000 است.
عددهای ممیز شناور را میتوان در نماد اعشاری یا نمایی نوشت.
در بیشتر موارد، برای عددهای صحیح از Int و برای عددهای ممیز شناور از Double استفاده میکنید:
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
سوئیفت عملگرهای حساب استانداردی برای محاسبههای عددی ارائه میدهد:
| عملگر | توضیح | مثال |
|---|---|---|
+ |
جمع |
4 + 6 برابر است با 10
|
- |
تفریق |
15 - 10 برابر است با 5
|
* |
ضرب |
2 * 3 برابر است با 6
|
سوئیفت از نظر نوع ایمن است و اجازه نمیدهد نوعهای عددی متفاوت در عملیات حسابی با هم ترکیب شوند.
نمیتوانید یک Int و یک Double را مستقیماً با هم جمع یا ضرب کنید؛ ابتدا باید یکی از این دو نوع را به نوع دیگر تبدیل کنید.
عملگر / تقسیم را انجام میدهد.
وقتی هر دو عملوند عدد صحیح باشند، تقسیم صحیح بخش اعشاری را حذف میکند:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
تقسیم یک عدد ممیز شناور ناصفر بر صفر به inf یا -inf میانجامد.
تقسیم 0.0 بر 0.0 مقدار nan را تولید میکند (عدد نیست).
در مقابل، تقسیم یک عدد صحیح بر صفر باعث خطای زمان کامپایل یا زمان اجرا میشود:
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
عملگر باقیمانده (%) باقیماندهی حاصل از تقسیم دو عدد صحیح را محاسبه میکند:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
در سوئیفت، % یک عملگر واقعی باقیمانده است، نه یک عملگر پیمانه.
نتیجه همیشه علامت عملوند اول (مقسوم) را میگیرد، بدون توجه به علامت عملوند دوم:
5 % -2 // 1
-5 % 2 // -1
میتوانید یک عدد ممیز شناور را با متد rounded() گرد کنید.
بهطور پیشفرض، rounded() به نزدیکترین عدد صحیح گرد میکند.
همچنین میتوانید یک قاعدهی گرد کردن مشخص، مانند .up یا .down، تعیین کنید:
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
وقتی یک ثابت یا متغیر عددی را بدون تعیین نوع اعلام میکنید، سوئیفت نوع آن را استنتاج میکند:
Int در نظر گرفته میشوند.Double در نظر گرفته میشوند.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
برای انجام عملیات بین مقدارهایی با نوعهای متفاوت، یکی از مقدارها را با سازندههای نوع مانند Double(_:) یا Int(_:) تبدیل کنید:
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
در این تمرین کدی مینویسید که به یک فریلنسر کمک میکند دربارهی قیمت پروژههای مشخصی با مشتریانش صحبت کند. چند تابع کمکی مینویسید تا هزینهها را برای مشتریان سریع محاسبه کنید.
مشتریای با فریلنسر تماس میگیرد تا دربارهی نرخهایش بپرسد. فریلنسر توضیح میدهد که او روزی ۸ ساعت کار میکند. اما فریلنسر فقط نرخ ساعتی خود برای پروژه را میداند. به او کمک کنید نرخ روزانه را بر اساس نرخ ساعتی تخمین بزند.
تابع dailyRateFrom(hourlyRate:) را پیادهسازی کنید؛ این تابع آرگومان hourlyRate را میگیرد که نرخ ساعتی فریلنسر را در خود نگه میدارد.
تابع باید نرخ روزانه را بر اساس نرخ ساعتی برگرداند.
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
نرخ روزانهی برگرداندهشده باید از نوع Double باشد.
گاهی مشتری میخواهد فریلنسر را برای مدت طولانیتری استخدام کند. فریلنسر حاضر است به مشتری تخفیف بدهد، اما فقط در صورتی که مشتری او را حداقل برای یک ماه استخدام کند. در مجموع ۲۲ روز کاری وجود دارد. به فریلنسر کمک کنید نرخ ماهانهاش را بر اساس نرخ ساعتی و درصد تخفیفی که حاضر است روی نرخ ثابت اعمال کند محاسبه کند، گردشده به نزدیکترین عدد صحیح.
تابع monthlyRateFrom(hourlyRate:withDiscount:) را پیادهسازی کنید؛ این تابع آرگومانهای hourlyRate را میگیرد که نرخ ساعتی فریلنسر را در خود نگه میدارد، و withDiscount که تخفیفی را در خود نگه میدارد که فریلنسر حاضر است به مشتری بدهد.
تابع باید نرخ ماهانه را گردشده به نزدیکترین عدد صحیح برگرداند.
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
روزی دیگر، مدیر پروژهای به فریلنسر پیشنهاد میدهد روی پروژهای با بودجهی ثابت کار کند. با در نظر گرفتن بودجهی ثابت و نرخ ساعتی فریلنسر، به او کمک کنید محاسبه کند که چند روز کار میکند تا بودجه تمام شود. در نظر داشته باشید که در این سناریو فریلنسر همیشه حاضر است تخفیف بدهد، فارغ از تعداد روزهای استخدام. نتیجه باید به نزدیکترین عدد صحیح به پایین گرد شود.
تابع workdaysIn(budget:hourlyRate:withDiscount:) را پیادهسازی کنید؛ این تابع آرگومانهای زیر را میگیرد:
budget که بودجهی پروژه را در خود نگه میدارد.hourlyRate که نرخ ساعتی فریلنسر را در خود نگه میدارد.withDiscount که تخفیفی را در خود نگه میدارد که فریلنسر حاضر است به مشتری بدهد.تابع باید تعداد روزهای کاری فریلنسر روی پروژه را به پایین گردشده برگرداند.
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0