در این مقاله علاوه بر توضیح نحوه کنترل تساوی دو عنصر درباره کلاس ها و ارث بری کلاس ها صحبت خواهیم کرد.
اپراتورهای هویت
این مقاله ترجمه ای از سایت Apple Docs تحت عنوان Testing for identity میباشد. ولی قبل از اینکه به ترجمه این مقاله بپردازیم این نکته را در نظر داشته باشید:
ما در کلاس ها و Structure ها از انواع ارجاعات شمال رفرنس و کپی صحبت کردیم در این مقاله اپل قصد دارد نحوه تائید درستی ساختار نهایی را به ما بیاموزد. این کار براحتی قابل انجام است. در نرم افزار سویفت ما اپراتوری داریم که دارای سه علامت مساوی است و صحت تساوی داده ها را تائید می کند. همانطور که میدانید اگر از یک تساوی استفاده کنیم مقدار سمت راست تساوی در مقدار سمت چپ تساوی ریخته میشود. اگر از دو علامت مساوی استفاده کنیم ، برابری مقدار داده ها بدون توجه به ساختار آنها چک می شود. و اگر از سه مساوی استفاده کنیم هم مقدار داده و هم یکی بودن ساختار آنها برای تساوی کنترل میگردد.
به مثال های زیر نگاه کنید:
Identical to (===)
Not identical to (!==)
در زیر ما یک لیست از کاربران یک بازی را گرداوری می کنیم.برخی از کاربران را درون متغیری به نام host قرار داده و برخی امکانات را میتوانیم برای این کابران استثناء کنیم.
var users: User[] = [ ... ] // User[] means Array of Users
var host = /* some user */
for user in users {
if user === host {
// host logic here
println("this is the host")
} else {
// guest logic here
println("this is a guest")
}
}
در این مثال سویفت اجازه استفاده از دو علامت مساوی را نمی دهد و دلیلی برای نگرانی از بابت باگ های که ممکن است بخاطر عدم تساوی وجود داشته باشد نباشید.
ارث بری کلاس ها
یک کلاس میتواند متدها ، ویژگی ها، و اشیاءدیگری را از سایر کلاس ها به ارث ببرد. وقتی که یک کلاس از کلاس دیگری ارث میبرد به نام Subclass شناخته میشود. کلاسی که به کلاس دیگر ارث میدهد superclass نامیده میشود. ارثبری ساختاری است که با سایر کلاس ها در سویفت متفاوت است:
class AClass {
func doSomething() {
println("Hello from AClass")
}
}
class Subclass: AClass {
}
let base_object = AClass()
base_object.doSomething()
//> Hello from AClass
let enhanced_object = Subclass()
enhanced_object.doSomething()
// > Hello from AClass
بازنویسی عناصر کلاس
شما میتوانید متدهای را برای رفتاری خاص بازنویسی کنید. برای باز نویسی متد، واژه override را قبل از تعریف متد درج کنید:
class AClass {
func doSomething() {
println("Hello from AClass")
}
}
class Subclass: AClass {
override func doSomething() {
println("Hello from Subclass")
}
}
let base_object = AClass()
base_object.doSomething()
//> Hello from AClass
let enhanced_object = Subclass()
enhanced_object.doSomething()
//> Hello from Subclass
شما میتوانید از واژه super برای فراخوانی هر متدی از کلاس superclass استفاده کنید.
...
class Subclass: AClass {
override func doSomething() {
super.doSomething()
println("Hello from Subclass")
}
}
let enhanced_object = Subclass()
enhanced_object.doSomething()
//> Hello from AClass
//> Hello from Subclass
کلاس های Base
کلاسی که توسط کلاس های دیگر به ارث برده نمی شود را base class مینامیم مثال:
class User {
var name: String!
var age: Int!
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
کلاس ها در سیستم عامل ios و Mac OS معمولا از NSObject ارث میبرند ، پیشنهاد میشود که برای ایجاد یک کلاس جدید از subclass NSObject استفاده کنید:
کلاس های سویفت که subclasses کلاس NSObject هستند:
این کلاس ها جزئ کلاس های Objective-C میباشند.
استفاده از متد objc_msgSend() برای فراخوانی اغلب متدهای این کلاس ها
فراخوانی متادیتا Objective-C runtime برای بکارگیری بیشتر متد ها
کلاس های سویفت که زیر کلاس NSObject نیستند:
این کلاس ها از کلاس های Objective-C بوده ولی بکارگیری آنها تنها برای متدهای NSObject کاربرد دارد.
از متد objc_msgSend() برای فراخوانی متد های این کلاس ها بطور پیشفرض نمی توان استفاده کرد.
عدم استفاده از متادیتا Objective-C runtime برای بکارگیری این کلاس ها بطور پیشفرض
برای جلوگیری از طولانی شدن این بحث پروتکل ها را در مقاله دیگری توضیح خواهیم داد.
براي بهره مندي از مشاوره تخصصي در زمینه برنامه نویسی ios در کرج با شرکت سارگون تماس بگيريد