تبدیل انواع داده

در زبان Swift امکان تبدیل یک نوع به نوع دیگر وجود دارد که اصطلاحاً به آن Type Casting گفته می‌شود. Swift دارای مجموعه‌ای از کلاس‌های از پیش تعریف شده است، که می‌توانند مقادیر را از یک نوع بـه نوع دیگر تبدیل کنند. در Swift بر خلاف بسیاری از زبان‌های برنامه نویسی، تبدیل ضمنی وجود ندارد. یعنی یک نوع داده به طور خودکار به نوع دیگر تبدیل نمی‌شود. به کد زیر توجه کنید:

var number1: Double = 5.25
var number2: Int    = number1

در کد بالا، ما یک متغیر از نوع Double به نام number1 تعریف کرده و آن را با استفاده از علامت = در داخل یک متغیر از نوع Int به نام number2 قرار داده‌ایم. با این کار از کامپایلر خواسته‌ایم که، یک نوع Double را به نوع Int تبدیل کند. ولی کامپایلر Swift این کار را انجام نمی‌دهد و برنامه با خطا مواجه می‌شود. برای انجام همچین کاری باید از تبدیل صریح استفاده کنیم که یک نوع تبدیل اجباری بوده و کامپایلر را وادار به انجام می‌کند و نحوه انجام آن به صورت زیر است:

var variableB: datatypeB = datatypeB(variableA)

با توجه به کد بالا، اگر بخواهیم یک نوع Double را به یک نوع Int تبدیل کنیم، باید به صورت زیر عمل نماییم:

var number1: Double = 5.25
var number2: Int    = Int(number1)

print(number2)
5

حال اگر برنامه را اجرا کنید با خطا مواجه نخواهید شد. به این نکته توجه کنید که در هنگام استفاده از تبدیل صریح ممکن است، مقادیر اصلی تغییر کنند. برای مثال، وقتی که در کد بالا، یک عدد با ممیز اعشار مثلاً از نوع Double را به یک نوع Int تبدیل می‌کنیم، مقدار اعداد بعد از ممیز از بین می‌روند. خروجی کد بالا عدد 5 است چون نوع داده‌ای Int نمی‌تواند مقدار اعشار بگیرد. حالت دیگر را تصور کنید. اگر شما بخواهید یک متغیر را که دارای مقداری بیشتر از محدوده متغیر مقصد هست تبدیل کنید، چه اتفاقی می افتد؟ مانند تبدیل زیر که می‌خواهیم متغیر number1 را که دارای مقدار 300 است را به نوع بایت تبدیل کنیم که محدود اعداد بین 255-0 را پوشش می‌دهد:

var number1: UInt32 = 300
var number2: UInt8  = UInt8(number1)

print(number2)
Fatal error: Not enough bits to represent a signed value

برنامه با خطا مواجه می‌شود. دلیل این امر این است که، UInt8 فقط می‌تواند شامل اعداد 0 تا 255 باشد و نمی‌تواند مقدار 300 را در خود ذخیره کند. علت خطا به تعداد بیتها بستگی دارد. یک UInt8 دارای 8 بیت است درحالی که UInt32 دارای 32 بیت است.

300 = 00000000000000000000000100101100
255 = 11111111

خروجی بالا نشان می‌دهد که بیشترین مقدار UInt8 که عدد 255 است، می‌تواند فقط شامل 8 بیت باشد (11111111) بنابراین فقط 8 بیت اول مقدار UInt32 به متغیر UInt8 انتقال می‌یابد و چون بقیه بیت‌ها قابل انتقال نیستند با خطای Not enough bits to represent a signed value مواجه می‌شویم. می‌توان با استفاده از Type Casting یا تبدیل صریح یک نوع رشته‌ای را هم به انواع عددی تبدیل کرد. به کد زیر توجه کنید:

var stringValue = "300"
var numberValue = Int(stringValue)!

print(numberValue)
300

به این نکته توجه کنید که در تبدیل یک نوع رشته‌ای به عددی باید بعد از پرانتز بسته از علامت! استفاده کنید. حال چطور بفهمیم که واقعاً تبدیل درست انجام شده و numberValue از نوع Int است؟ برای این منظور از دستور (:of)type استفاده می‌کنیم. در ادامه کدهای بالا، دستور زیر را بنویسید:

print(type(of: numberValue))

برنامه را بار دیگر کامپایل و اجرا و نتیجه را مشاهده کنید:

300
Int