ویدیوی آموزش swift قسمت هفتم- Propertie

ویدیوی آموزش swift قسمت هفتم- Propertie

در این جا می خواهیم در مورد ساختمان ها و کلاس ها بحث property ها را ادامه دهیم.

همان طور که اشاره کردیم٬ property ها چند حالت مختلف دارند که  می خواهیم به صورت مفصل تر  در موردش صحبت کنیم.

Stored Properties یا variable stored properties

حالت اول Stored Properties یا variable stored properties هستند که در واقع بسیار ساده هستند. در این جا متغیر با var یا let تعریف می شود و به طور مثال با مقادیر ۳ و ۰ مقدار دهی می شود. مقدارش قابل تغییر است و فقط کار ذخیره سازی را به عهده دارد. یک حالت دیگه از Stored Properties ها٬ Constant Structure Instances ها هستند به این صورت که به جای این که instance رو با var تعریف کنیم٬ با let تعریف می کنیم. وقتی که مقدارش را تغییر می دهیم با خطا مواجه می شویم. درست است که firstvalue با var تعریف شده است ولی instance ما با let تعریف شده است و قابل تغییر نیست. به همین دلیل با خطا مواجه می شویم.

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)

 

 ویدیوی آموزش swift قسمت هفتم- Propertie

قابلیت خیلی خوبی که در این جا داریم٬ Lazy Stored ها هستند که برای مواقعی که کلاس های بزرگی داریم و همش در حال فراخوانی است استفاده می شود.

( برای مشاهده ویدیو و لینک دانلود لطفا به ادامه مطلب مراجعه فرمایید )

به عنوان مثال در اینجا کلاس DataImporter را داریم که یک متغیر fileName دارد که کارش import کردن داده است.

یک کلاس DataManager داریم که متغیر importer که از نوع DataImporter است به صورت lazy تعریف شده است. خب کار lazyها به این صورت است که تا زمانی که ما منغیر importer از DataManager مون رو فراخوانی نکنیم٬ هیچ instance ی از DataImporter درست نمی شود. در واقع زمانی به کارهایی امثال instance سازی پرداخته نمی شود.

lazy var importer = DataImporter()

 

در کلاس DataManager یک متغیر data داریم که یک آرایه از string است. جلوتر یک instance از DataManager درست کردیم به نام manager. به متغیر data یک مقداری رو append کردیم. دوباره به همون data یک مقدار دیگر رو append کردیم.

manager.data.append("Some data")
manager.data.append("Some more data")

 

تا اینجا هیچ instance ی از DataImporter درست نشده است. تا زمانی که ما به این قسمت می رسیم که importer از DataManager فراخوانی میشه و قسمت fileName ش چاپ می شود و instance ساخته می شود و fileName برگردانده می شود.

print(manager.importer.fileName)

خروجی:

"data.txt\n"

 

در زمانی که ما از threads ها استفاده می کنیم  و  multithreads داریم٬ معلوم نیست کی٬ کدوم threads متفیر lazy رو فراخوانی می کند. به خاطر همین ممکن است در بعضی مواقع نا هماهنگی رخ بدهد و هیج ضمانتی وجود ندارد که متغیر lazy فقط یک بار initialized بشود و ممکن است چندین بار این اتفاق بیفتد.

Computed Properties

در قسمت بعدی در مورد Computed Properties ها صحبت می کنیم.

در این جا یک ساختمان به نام Point داریم و نقاط صفحمون رو به صورت x و y نگه می دارد.  یک ساختمان به نام Size داریم٬ همان طور که مشاهده می کنید و معلوم است٬ عرض و ارتفاع رو برامون نگه داری می کند.  یک ساختمان هم به نام Rect داریم که موقعیت را با یک instance خالی از Point  و یک instance خای از Size داریم. در این جا ما با یک Computed Properties مواجه می شویم که اسمش center است. همانطور که ملاحظه می کنید٬ نوعش از نوع Point است ولی هیچ مقداردهی به آن انجام نشده است. زمانی که می خواهیم center مون رو get کنیم٬  می خواهیم بدونیم که مقدارش چقدر هست٬ قسمت get برنامه فراخوانی می شود و در واقع نقطه x ٬ center x اش محاسبه می شود از روی Point ی که بهش دادیم به علاوه ی عرض سایز تقسیم بر ۲ می شود. برای y هم به همین صورت. در نهایت هم به ساختمان Point ٬ X و y  رو بهش  پاس می دهیم و از نوع Point یه مقداری رو براش بر می گردونیم. زمانی هم که می خواهیم set کنیم٬  در واقع یک مختصاصت  x و y از نوع Point برامون ارسال می شود  و ما جابجایی یک نقطه از یک مکان به مکان دیگر را با این عمل انجام می دهیم.

struct Rect {
    
    var origin = Point()
    var size = Size()
    var center: Point {
    
        get {
        
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))

let initialSquareCenter = square.center

square.center = Point(x: 15.0, y: 15.0)

print("square.origin is now at (\(square.origin.x), \(square.origin.y))")

 

خب٬‌حالا ما این جا یک instance از Rect ایجاد می کنیم موقعیت گوشه سمت چپ٬ بالا رو بهش پاس می دهیم٬ نقطه ی (۰٬۰) ٬ سایز رو هم بهش پاس می دهیم  که برامون یک Rect  درست می کند.

مختصات وسط Rect مون رو  در یک ثابت می ریزیم.

حالا اگر بخواهیم وسط شی مون رو جابجا کنیم باید چیکار کنیم؟!

یک مختصات میانی رو بهش پاس می دهیم٬ شی مون جابجا می شود.

حالا کافیه که مقدار x و y رو چاپ کنیم میبینید که به عرض ۱۰ جابجا شده است.

var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))

let initialSquareCenter = square.center

square.center = Point(x: 15.0, y: 15.0)

print("square.origin is now at (\(square.origin.x), \(square.origin.y))")

خروجی:

 "square.origin is now at (10.0, 10.0)\n"

 

حالت دیگری که داریم٬ Read-Only Computed Properties ها هستند که ما در آن فقط قابلیت خوندن رو داریم و قابلیت نوشتن و ذخیره سازی در آن را نداریم. کاربردش زمانی است که ما می خواهیم یک متغیر داشته باشیم و فقط می خواهیم بخونیمش و قرار نیست که چیی را تغییر بدهیم و یا ذخیره سازی کنیم. بیشتر برای کارهای محاسباتی نظیر محاسبه حجم مکعب استفاده می شوند.

Property Observers

می رسیم به Property Observers ها .

زمانی که یک property تغییر می کند٬ ما می خواهیم یک رویدادی را فراخوانی کنیم و از آن استفاده کنیم. از willSet و didSet استفاده می شود که willSet زمانی که متغیرمون هنوز تغیر نکرده است فراخوانی ی شود و  didSet هم بعد از فرایند انتصاب فراخوانی می شود.

یک کلاس به نام StepCounter داریم که در واقع قدم ها را می شمارد. اول و در قسمت willSet تعداد قدم های اولیه را چاپ می کند و در قسمت didSet تعداد قدم های جلورفته را چاپ می کند.

یک instance ایجاد می کنیم و مقدار اولیه آن را ۲۰۰ قرار می دهیم. مقدار رو به ۳۶۰ تغییر می دهیم٬ حالا خروجی چاپ می کند که ۱۶۰ قدم به جلو گام برداشته شده است.

قسمت بعدی Global and Local Variables ها هستند.

نوع Global ها تا زمان یکه فراخوانی  نشده اند٬‌ از نوع lazy ها هستند ولی برای Local ها باید صراحتا اعلام کنید که lazy باشند در غیر این صوررت lazy نیستند.

static members

رسیدیم به بحث جذاب static members ها.

در این جا یک ساختمان به نام AudioChannel داریم که از کلمه کلیدی static در اول یک ثابت استفاده کرده است که مقدارش هم ۱۰ می باشد. ماکزیمم صدا رو دریم که مقدار پیش فرضش ۰ است  ولی باز هم static است. یک متغیر currentLevel داریم که مقدار اولیه اش ۰ است. بعد از این عمل انتصاب ما فقط چک می کنیم که آیا  currentLevel  اگر بزرگتر از AudioChannel.thresholdLevel بود٬ بیا AudioChannel.thresholdLevel رو داخل currentLevel بریز. برای maxInputLevelForAllChannels هم همین حالت را داریم.

حالا ما فرض کنیم که یک leftChannel و یک rightChannel داریم. اگر من مقدار leftChannel.currentLevel رو به عدد ۷ تغییر بدم٬ وارد if اول میشه و مقدار ۷ رو چاپ می کند و اگر مقدار rightChannel.currentLevel = 11 رو به ۱۱ تغیر بدهم٬ وارد if  دوم می شود و عدد ۱۰ را چاپ می کند.

امیدوارم از دیدن این ویدئو لذت برده باشید.

ویدیو رو می تونید از این لینک دانلود کنید.

کلیه ی کد ها و مثال ها در آدرس github من هستند و می توانید به آن ها دسترسی داشه باشید.

خدا یار و نگهدارتون

5 نظر ویدیوی آموزش swift قسمت هفتم- Propertie

  1. aman

    سلام وقت بخیر
    با تشکر از آموزش های مفید تون می خواستم ببینم
    آموزش سوییفت به اتمام رسیده ؟ یا آموزش بیشرفته هم خواهید داشت؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *