با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش Swift را دنبال می کنند. در بخش های قبلی مشاهده کردیم که می توان در بلوک ساختارها و کلاس ها توابعی را نیز به عنوان متد تعریف کنیم که این متدها می توانند پارامترهایی را به عنوان ورودی دریافت کرده و پس از انجام محاسبات و دستورات تعریف شده در آنها ، نتیجه را در خروجی نمایش دهند. متدها از اجزای اصلی ساختارها و کلاس ها محسوب می شوند و کلاس ها با استفاده از متدها می توانند تغییرات مختلف را روی داده های ورودی اعمال کرده و نتیجه را بازگردانند. در ادامه ی این مبحث شما را با چگونگی کار با متدها در Swift آشنا خواهیم کرد.
در این آموزش شما را با سینتکس ، بخش ها و طرز کار با متدها در Swift آشنا خواهیم کرد.
در زبان های برنامه نویسی با استفاده از متدهای نمونه می توان از ویژگی های کلاس ها، سازه ها و شمارنده ها استفاده کرد.
متدهای نمونه ویژگی ها زیر را ارائه می کند:
متدهای نمونه را می توان داخل براکت “{ }” تعریف کرد.
این برای دسترسی ضمنی به خصوصیات و متدهای یک نوع است.
1 2 3 4 5 6 7 | func funcname(Parameters) -> returntype { Statement1 Statement2 --- Statement N return parameters } |
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b } func tot(c: Int) -> Int { return res - c } func result() { print("Result is: \(tot(c: 20))") print("Result is: \(tot(c: 50))") } } let pri = calculations(a: 600, b: 300) pri.result() |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 | Result is: 880 Result is: 850 |
محاسبات کلاس دو متد نمونه را تعریف می کند:
در نهایت، برای چاپ محاسبات متد با مقادیر a و b فراخوانی می شود.
متد های نمونه با ‘.’ قابل دسترسی هستند.
Swift 4 توابع اعلامیه های محلی و جهانی را برای متغیرهای خود توصیف می کنند.
پارامتر اول در Swift 4 با نام پیش فرض به عنوان ‘with’، ‘for’ و ‘by’ برای دسترسی آسان به کنوانسیون نامگذاری اشاره شده است.
Swift 4 انعطاف پذیری در متدها را با اعلام نام پارامتر اول به عنوان نام پارامترهای محلی و نام های پارامتر باقیمانده را به عنوان نام های پارامترهای عمومی، فراهم می کند.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 | class division { var count: Int = 0 func incrementBy(no1: Int, no2: Int) { count = no1 / no2 print(count) } } let counter = division() counter.incrementBy(no1: 1800, no2: 3) counter.incrementBy(no1: 1600, no2: 5) counter.incrementBy(no1: 11000, no2: 3) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 | 600 320 3666 |
برای تعریف پارامترها در سطح عمومی باید از نماد ‘#’ به عنوان پیشوند استفاده کرد.
هنگامی که کاربر نیاز به دسترسی به پارامترهای زیر مجموعه با یک نام عمومی دارد. باید از نماد ‘_’ در نام متد استفاد کرد.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class multiplication { var count: Int = 0 func incrementBy(no1: Int, no2: Int) { count = no1 * no2 print(count) } } let counter = multiplication() counter.incrementBy(no1: 800, no2: 3) counter.incrementBy(no1: 100, no2: 5) counter.incrementBy(no1: 15000, no2: 3) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 | 2400 500 45000 |
متدها دارای خصوصیات ضمنی می باشند که به عنوان ‘self’ برای تمام انواع نمونه ها تعریف شده است.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class calculations { let a: Int let b: Int let res: Int init(a: Int, b: Int) { self.a = a self.b = b res = a + b print("Inside Self Block: \(res)") } func tot(c: Int) -> Int { return res - c } func result() { print("Result is: \(tot(c: 20))") print("Result is: \(tot(c: 50))") } } let pri = calculations(a: 600, b: 300) let sum = calculations(a: 1200, b: 300) pri.result() sum.result() |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 4 5 6 | Inside Self Block: 900 Inside Self Block: 1500 Result is: 880 Result is: 850 Result is: 1480 Result is: 1450 |
در Swift 4 ساختارهای زبان و شمارشگرها به انواع ارزش ها تعلق دارند که توسط متد نمونه آن را نمیت وان تغییر داد.
با این حال، زبان Swift 4، انعطاف پذیری را برای تغییر انواع ارزش با رفتار “mutating” فراهم می کند.
Mutate هر گونه تغییرات در متد نمونه را انجام می دهد و بعد از اجرای متد به فرم اولیه بازگردانده می شود.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { length *= res breadth *= res print(length) print(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(res: 3) val.scaleBy(res: 30) val.scaleBy(res: 300) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 3 4 5 6 | 9 15 270 450 81000 135000 |
متدهای Mutating در ترکیب با ‘self’ یک نمونه جدید را به متد تعریف شده اختصاص می دهند.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | struct area { var length = 1 var breadth = 1 func area() -> Int { return length * breadth } mutating func scaleBy(res: Int) { self.length *= res self.breadth *= res print(length) print(breadth) } } var val = area(length: 3, breadth: 5) val.scaleBy(res: 13) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 | 39 65 |
هنگامی که یک نمونه خاصی از یک متد فراخوانی می شود. این به عنوان یک متد نمونه فراخوانی می شود.
و هنگامی که متد نوع خاصی از یک متد را فراخوانی می کند، به عنوان ‘Type Methods’ نامیده می شود.
از متدهای نوع برای کلاسها با استفاده از کلیدواژه func استفاده می شود.
همچنین در ساختارها و متدهای شمارنده نیز از کلمه کلیدی static قبل از کلید واژه func استفاده می شود.
متدهای متداول با استفاده از سینتکس ‘.’ قابل فراخوانی هستند.
مثال :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Math { class func abs(number: Int) -> Int { if number < 0 { return (-number) } else { return number } } } struct absno { static func abs(number: Int) -> Int { if number < 0 { return (-number) } else { return number } } } let no = Math.abs(number: -35) let num = absno.abs(number: -5) print(no) print(num) |
نتیجه ی کامپایل و اجرای کد فوق به صورت زیر خواهد بود:
1 2 | 35 5 |
کلاس ها و ساختارها از دو دسته ی کلی تشکیل می شود که یک مورد خصوصیات است که در بخش قبلی بررسی شد و مورد دیگر متدهاست که کار اصلی را انجام می دهند و امکان ارسال مقادیر و تغییرات روی آن ها را به راحتی فراهم می کند، از این رو در این بخش به بررسی مباحث کار با متدها در Swift پرداختیم.