کلمه کلیدی inout

از کلمه کلیدی inout زمانی استفاده می‌شود که شما بخواهید مقدار یک پارامتر را در داخل تابع تغییر دهید و این تغییر حتی بعد از خروج از تابع، همچنان پا بر جا بماند. به صورت پیشفرض، پارامترهای تابع از نوع ثابت هستند و نمی‌توانید مقدار آنها را در داخل تابع تغییر دهید. به مثال زیر توجه کنید:

func changeParameterValue(_ number: Int)
{
    number = 10
}

changeParameterValue(5)

در کد بالا، ما یک تابع به نام ()changeParameterValue که دارای یک پارامتر به نام number است. در خط آخر مقدار 5 را به این پارامتر ارسال کرده‌ایم و در داخل بدنه تابع سعی کرده‌ایم که مقدار پارامتر number را برابر عدد 10 قرار دهیم. این کار باعث خطای cannot assign to value: ‘number’ is a ‘let’ constant شده و به ما اجازه تغییر مقدار پارامتر داده نمی‌شود، چون پارامترها از نوع ثابت هستند. حال اگر بخواهیم این کار را واقعاً انجام دهیم، راه حل استفاده از کلمه کلیدی inout به صورت زیر است:

func functionName(param1: inout datatype) -> returnType
{
    // code to execute
}

وقتی تابع فراخوانی می‌شود و آرگومانها به آنها ارسال می‌شود هم باید از علامت & استفاده شود.

 functionName(param1: &num)

به مثال زیر توجه کنید:

 1: func ModifyNumberRef(number: inout Int)
 2: {
 3:     number += 10
 4:     print("Value of number inside function is ", number)
 5: }
 6:
 7: var num: Int = 5
 8:
 9: print("num = \(num) \n")
10:
11: print("Passing num by inout to function ModifyNumberRef() ...")
12: ModifyNumberRef(number: &num)
13: print("Value of num after exiting the function is \(num) \n")
num = 5

Passing num by inout to function ModifyNumberRef() ...
Value of number inside function is 15
Value of num after exiting the function is 15

در برنامه یک تابع تعریف شده است و هدفش اضافه کردن عدد 10 به مقداری است که، به آن ارسال می‌شود. در تعریف پارامترهای این تابع از کلمه کلیدی inout استفاده کرده‌ایم که این به برنامه می‌گوید که ما می‌خواهیم تغییراتی را در پارامتر بدهیم و این تغییر در خارج از تابع هم اثرش بماند. در خط 7 کد بالا یک متغیر به نام num تعریف کرده و مقدار آن را 5 قرار می‌دهیم. همین مقدار را در خط 12 به تابع ارسال می‌کنیم. مقدار این متغیر به جای پارامتر number نشسته و در خط 3 عدد 10 به آن اضافه می‌شود.

چون از کلمه inout در تعریف پارامتر استفاده شده است، اجازه این تغییر به ما داده می‌شود. حال همین مقدار 15 در خارج از تابع و به متغیر num هم اعمال می‌شود. این را می‌توان با چاپ مقدار num قبل و بعد از فراخوانی تابع ()ModifyNumberRef متوجه شد (خطوط 9 و 13). کلمه inout کاربردهای خاص خود را دارد که در آینده در مورد آن توضیح می‌دهیم.