در ادامه تعریف کلاس ها در این مقاله به معرفی ویژگی های خاص Structre خواهیم پرداخت
همه structure ها دارای یک memberwise initializer هستند که بصورت اتوماتیک ایجاد می شود. با این memberwise initializer شما میتوانید آغازگر را به صورت یک ثابت به عضویت یک structure در بیاورید. مقدار اولیه ی، یک ویژگی، از یک متغییر نمونه، میتواند به کمک نام توسط memberwise initializer ارجاع داده شود.
let vga = Resolution(width: 640, height: 480)
برخلاف structures کلاس ها بطور پیشفرض memberwise initializer را دریافت نمی کنند .
Structures و شمارنده ها از نوع Value Types هستند
یک value type یک نوع است که مقدار را درهنگامیکه به یک متغییر یا ثابت و یا یک عملگر ارائه میشود کپی می کند.
شما در واقع در آموزش قبل از value types استفاده کرده اید. در واقع تمام مقدار های اولیه مانند integers, floating-point numbers, Booleans, strings, arrays و dictionariesها همگی value types هستند. این انواع داده بعنوان Structure در نیز بکار میروند.
همه structure ها و شمارنده ها در سویفت value types هستند . این به این معناست که هرشیئ Structures و شمارنده ای که شما میسازید ، و هر نوع مقداری که اینها بعنوان ویژگی یا صفت دربر میگیرند. هنگامی که آنها کپی میشوند در برگرفته خواهد شد. یا بعبارت ساده تر نوع داده و مقدار داده هردو در هنگام کپی شدن انتقال می یاند.
به این مثال نگاه کنید. ما از Structure مثال یعنی resolution دوباره استفاده کرده ایم:
let hd = Resolution(width: 1920, height: 1080) var cinema = hd
این مثال یک ثابت به نام hd را تعریف می کند. سپس آن را با یک Resolution با مقدار مشخص طول و عرض تنظیم می کند. این مقادیر برای ویدئوی HD (1920×1080 ) میباشد .
سپس یک متغییر به نام Cinema تعریف شده و آن را با مقدار فعلی hd تنظیم می کند. از آنجا که Resolution یک Structure است، یک کپی از مقدار آن ایجاد میشود. این مقدار کپی به متغییر cinema داده میشود. با اینکه هر دوی متغییر های hd و cinema هردو یک مقادر طول و عرض دارند ، آنها هرکدام یک شیئ جداگانه در نرم افزار به حساب می آیند.
تغییر مقدار متغییر کپی شده
در گام بعد ما میزان width متغییر cinema را کمی عریض تر میکنیم تا با سینماهای دیجیتال همخوانی داشته باشد (2048=width و 1080 = high):
cinema.width = 2048
در زیر ما میزان عرض متغییر سینما را برای کنترل صحت مقدار آن چاپ کرده ایم:
print("cinema is now \(cinema.width) pixels wide") // Prints "cinema is now 2048 pixels wide"
با اینحال ویژگی Width در متغییر اصلی hd همان مقدار 1920 خواهد ماند.
print("hd is still \(hd.width) pixels wide") // Prints "hd is still 1920 pixels wide"
توضیح عملکرد متغییر کپی شده
زمانیکه cinema مقدار فعلی hd را رائه میداد، مقادیر از hd به متغییر Cinema کپی شده بودند، اما در نتیجه تغییرات این دو متغییر مقادیر کاملا متفاوتی از هم داشتند. این به این دلیل اتفاق می افتد که متغییر cinema و متغییر hd بعد از دریافت کپی محتوای hd توسط Cinema هیچ ارتباط باهم نداشته و بصورت مستقل عمل می کنند.
همین عملکرد را در مثالی درباره شمارشگرها مشاهده کنید.
enum CompassPoint { case north, south, east, west } var currentDirection = CompassPoint.west let rememberedDirection = currentDirection currentDirection = .east if rememberedDirection == .west { print("The remembered direction is still .west") } // Prints "The remembered direction is still .west"
وقتیکه ثابت rememberedDirection یک مقدار بصورت currentDirection دریافت می کند. در واقع یک کپی از مقدار را دریافت می کند. در این حالت تغییر مقدار currentDirection تاثیری بر مقدار آن در ثابت rememberedDirection نخواهد داشت.
در ادامه به توضیح نحوه عملکرد کلاس بصورت Reference Types می پردازیم.
براي بهره مندي از مشاوره تخصصي در زمینه برنامه نویسی ios با شرکت سارگون تماس بگيريد