Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأصناف هي مراجع

جزء من قسم البرمجة كائنية التوجه في رحلة Swift على Coddy. الدرس 5 من 57.

الفئة هي نوع مرجعي: يحتفظ المتغير بمرجع إلى الكائن، وليس بنسخة منه. يؤدي إسناد مثيل إلى متغير آخر إلى إنشاء اسم ثانٍ للكائن نفسه:

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

الناتج:

25

=== يتحقق مما إذا كان مرجعان يشيران إلى النسخة نفسها. تُعدّ النسختان المنفصلتان كائنين مختلفين حتى عندما تتطابق جميع خصائصهما:

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

الناتج:

true
false

تعمل الدالة التي تتلقى نسخةً على كائن المستدعي، لذا تظل التغييرات التي أُجريت داخل الدالة ظاهرةً بعد ذلك:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

الناتج:

4

تثبّت let المرجع، وليس الكائن. لا يمكن لثابت يحتوي على مثيل لفئة أن يشير إلى مثيل آخر، لكن خصائص var للمثيل يمكن أن تتغير مع ذلك. كما أن المصفوفات التي تحتوي على مثيلات تحتفظ بالمراجع أيضًا:

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

الناتج:

99
99
challenge icon

التحدي

سهل

يتشارك فريق واحد Budget. أكمل spend(_:amount:)، وهي دالة تأخذ ميزانية وتطرح المبلغ فقط إذا كان المتبقي كافيًا، وتُرجع true عندما يُسمح بالإنفاق. ثم أكمل runTeam(start:purchases:): أنشئ ميزانية واحدة، واجعل كل عملية شراء تنفق من تلك الميزانية نفسها، وأرجع سطرًا واحدًا لكل عملية شراء (ok 30 أو denied 80) متبوعًا بـ left 20.

يقرأ الكود المُقدَّم الميزانية الابتدائية وعمليات الشراء كسطر مفصول بفواصل، ويطبع كل سطر مُعاد.

ضع الكود الخاص بك في Budget.swift وFunctions.swift. يحتوي main.swift على كود الإدخال/الإخراج المُقدَّم ولا يمكن تعديله.

جرّب بنفسك

// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Swift