درون بدنهی یک تابع، با پارامترها مانند ثابت رفتار میشود، نه متغیر؛ اگر بخواهید مقدار یک پارامتر را تغییر دهید، خطای زمان کامپایل رخ میدهد. اگر تابعی بخواهد مقدار یک پارامتر را تغییر دهد، باید از یک پارامتر ورودی-خروجی استفاده کند تا این تغییرپذیری را صریح بیان کند.
برای استفاده از پارامترهای ورودی-خروجی، برنامهنویس باید سه نکته را در نظر داشته باشد:
۱. تعریف تابع باید پارامترهای ورودی-خروجی را بهصراحت مشخص کند؛ کلیدواژهی inout باید میان : و نام نوع، در حاشیهنویسی نوع پارامتر نوشته شود.
۲. مقداری که به پارامتر ورودی-خروجی پاس داده میشود باید به عنوان متغیر تعریف شده باشد، نه ثابت. به همین ترتیب، نمیتواند یک لیترال باشد.
۳. نام متغیر در فراخوانی تابع باید با یک & پیش از آن بیاید تا بهصراحت به عنوان قابلتغییر علامتگذاری شود.
وقتی این کار انجام شد، تابع یک رونوشت داخلی از پارامتر ورودی-خروجی میسازد، آن را همانطور که در بدنهی تابع دستور داده شده تغییر میدهد و سپس هنگام بازگشت تابع، مقدار تغییریافته را دوباره در متغیری که پاس داده شده بود رونوشت میکند.
func updateVersion(_ record: inout (version: Int, title: String)) {
record.version += 1
}
var dbRecord = (version: 2, title: "Exercism")
updateVersion(&dbRecord)
// dbRecord is now (3, "Exercism")
چند قاعدهی دیگر هم هست که باید دربارهی پارامترهای ورودی-خروجی بدانید.
۱. درون تابعی که پارامتر ورودی-خروجی دارد، اجازه ندارید به متغیری که به عنوان پارامتر ورودی-خروجی پاس داده شده است ارجاع دهید.
۲. یک متغیر یکسان را نمیتوان در همان تابع به عنوان چند پارامتر ورودی-خروجی پاس داد.
برای نمونه، `inoutFunc(&mutVar, &mutVar)` خطای کامپایلر ایجاد میکند.