داخل جسم الدالة، تُعامَل المعاملات كثوابت لا كمتغيرات. ومحاولة تعديل قيمة أحد المعاملات تؤدي إلى خطأ في وقت الترجمة. إذا أرادت دالة تعديل قيمة أحد معاملاتها، فعليها أن تستخدم معاملًا داخليًا وخارجيًا لتوضيح قابلية التعديل هذه بشكل صريح.
لاستخدام المعاملات الداخلية والخارجية، على المبرمج أن يتأكد من ثلاثة أمور:
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")
هناك بعض القواعد الإضافية التي ينبغي الانتباه إليها فيما يخص المعاملات الداخلية والخارجية.
1. داخل دالة لها معاملات داخلية وخارجية، لا يُسمح لك بالإشارة إلى المتغير الذي مُرِّر بوصفه المعامل الداخلي والخارجي.
2. لا يمكن تمرير المتغير نفسه كعدة معاملات داخلية وخارجية في الدالة نفسها.
على سبيل المثال، الاستدعاء `inoutFunc(&mutVar, &mutVar)` يُسبّب خطأً في وقت الترجمة.