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

هيكل أم فئة

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

إرشادات Swift هي البدء بهيكل واختيار فئة فقط عندما تحتاج إلى ما توفره الفئات وحدها. الهياكل أبسط: كل متغير يملك قيمته الخاصة، لذلك لا يفاجئ تغيير في مكان ما التعليمات البرمجية الموجودة في مكان آخر.

struct Temperature {
    var celsius: Double
}

var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)

الناتج:

21.0

اختر صنفًا عندما يجب أن يكون كائن واحد مشتركًا: تحتاج عدة أجزاء من البرنامج إلى رؤية الحالة المتغيرة نفسها، مثل حساب مصرفي واحد تستخدمه شاشات عديدة. تدعم الأصناف أيضًا التوريث، وهو ما لا تدعمه البُنى.

class SharedLog {
    var lines: [String] = []
}

let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)

الناتج:

2

يمكن للـ structs الحصول على == مجانًا. أضف Equatable إلى التصريح، وستقارن Swift كل خاصية؛ أما الأصناف فتقارن الهوية باستخدام === بدلًا من ذلك:

struct Point: Equatable {
    var x: Int
    var y: Int
}

print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))

الناتج:

true
false

فحص سريع: إذا كان ينبغي أن تُحتسب عنصران لهما البيانات نفسها على أنهما الشيء نفسه، فاستخدم struct (نقطة أو سعر أو تاريخ). وإذا كان للعنصر هوية مهمة حتى عندما تتطابق بياناته مع بيانات عنصر آخر (حساب مستخدم أو ملف مفتوح)، فاستخدم class.

struct Money { var cents: Int }          // 500 سنت هي 500 سنت
class UserAccount {                      // يمكن لحسابين مشاركة اسم
    let id: Int
    var name: String
    init(id: Int, name: String) { self.id = id; self.name = name }
}
challenge icon

التحدي

سهل

‏Point هو بنية يجب أن تكون قابلة للمقارنة باستخدام ==. أضف المطابقة وأكمل countDistinct(_:)، التي تُرجع عدد النقاط المختلفة الموجودة في القائمة (تكون النقطتان متماثلتين عندما يتطابق كلا الإحداثيين).

يقرأ الكود المُ supplied نقطة واحدة في كل سطر بالتنسيق x,y ويطبع distinct: مع العدد.

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

جرّب بنفسك

// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
var input: [String] = []
while let line = readLine() { input.append(line) }
let points = input.map { line -> Point in
    let p = line.split(separator: ",").map { Int($0)! }
    return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
quiz iconاختبر نفسك

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

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

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