Swift-এ মূলত দুই ধরনের সংখ্যা থাকে: ইন্টিজার আর ফ্লোটিং-পয়েন্ট সংখ্যা।
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
সংখ্যা নিয়ে হিসাব করার জন্য Swift সাধারণ পাটিগণিত অপারেটর দেয়:
| অপারেটর | বিবরণ | উদাহরণ |
|---|---|---|
+ |
যোগ |
4 + 6-এর ফলাফল 10
|
- |
বিয়োগ |
15 - 10-এর ফলাফল 5
|
* |
গুণ |
2 * 3-এর ফলাফল 6
|
Swift টাইপ-সেফ, তাই পাটিগণিতের কাজে ভিন্ন টাইপের সংখ্যা একসাথে মেশাতে দেয় না।
আপনি সরাসরি একটি 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 (Not a Number, অর্থাৎ সংখ্যা নয়)।
এর বিপরীতে, কোনো ইন্টিজারকে শূন্য দিয়ে ভাগ করলে কম্পাইল-টাইম বা রানটাইম এরর হয়:
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
Swift-এ % মডুলো অপারেটর নয়, বরং সত্যিকারের ভাগশেষ অপারেটর।
ফল সবসময় প্রথম অপারেন্ডের (যেটিকে ভাগ করা হচ্ছে) চিহ্নই নেয়, দ্বিতীয় অপারেন্ডের চিহ্ন যা-ই হোক না কেন:
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
টাইপ অ্যানোটেশন ছাড়া কোনো সংখ্যার কনস্ট্যান্ট বা ভ্যারিয়েবল ডিক্লেয়ার করলে Swift নিজেই তার টাইপ অনুমান করে নেয়:
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 আর্গুমেন্ট দুটি নেয়; 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
Exercism-এ সাইন আপ করুন, Swift ট্র্যাকের 35টি কনসেপ্ট116টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।