هيكل أم فئة
جزء من قسم البرمجة كائنية التوجه في رحلة 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 }
}التحدي
سهل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))")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأصناف والكائنات
العمل مع الملفاتتعريف الأصنافالأساليب وselfالمُهيِّئاتالأصناف هي مراجعمراجعة - بطاقة المكتبة4التغليف
التحكم في الوصولللقراءة فقط من الخارجحماية الحالةالمهيئات القابلة للفشلمراجعة - الحساب البنكي7تعدد الأشكال والأنواع العامة
تعدد الأشكالتحويل الأنواعالدوال العامةالأنواع العامةمراجعة - حاسبة الأشكالتدرّب بنفسك: Playground لـ Swift