آموزش SWIFT 2 برای IOS و OSX ؟
سوئیف گزینهی پیشنهادی اپل برای کدنویسی برنامه های سیستم عامل IOS میباشد. این برنامه مکمل Objective-C است و هم اکنون بهترین زمان برای یادگیری این زبان می باشد. برنامه نویس هایObjective-C شباهت های زیادی بین ویژگی های این برنامه با سوئیف تجربه خواهند کرد. این شباهت عبارتند از: تایپ قوی، نبود نیاز به فایلهای Header و غیره. در این مقاله به آموزش Swift 2 میپردازیم. ایجاد یک محیط کدنویسی را با هم مرور کرده و نگاهی به اصول و مبانی این برنامه در مقایسه با Objective-C، جاوا اسکریپت و #C خواهیم داشت. در انتهای این مقاله، شما یک برنامه ساده ولی کامل با سوئیف 2.0 خواهید نوشت. Swift 2.0 شباهت های زیادی از نظر Syntax و کدها با Objective-C و #C دارد.

ایجاد محیط کدنویسی
درست مثل Objective-C، سوئیف به مک و Xcode احتیاج دارد. هم اکنون، نسخه ی 7.2 آخرین نسخه ی در دسترس است که از فروشگاه اپل قابل دانلود می باشد.

حجم دانلود 2.5 GB است و ممکن است زمان زیادی ببرد. وقتی دانلود کامل شد، شاخه ی Applications را باز کرده و Xcode را اجرا کنید. تمامی Componentهای مورد نیاز را نصب کنید. اگر نسخه های قبلی Xcode را نصب کرده اید حتما بروزرسانی کنید. حالا، شما برای کدنویسی با سوئیف آماده اید.
اصول زبانی وSYNTAX در سوئیف
بیایید نگاهی به Syntax این زبان برنامه نویسی داشته باشیم و آن را با سایر برنامه های مدرن مقایسه کنیم. به دلیل این که تمامی جوانب زبان سوئیف را نمی توان در یک پست ارائه کرد، من از یک مثال ساده برای نشان دادن مفاهیم اصلی آن استفاده می کنم.

می توانید کدهای این مقاله را به شکل کامل از لینک زیر دانلود کنید:
https://github.com/sitepoint-editors/Introtoسوئیف2
متغیر ها و ثابت ها(CONSTANTS)
برای تعریف یک متغیر در سوئیف از کلمه کلیدی var استفاده می شود:
var number = 1
در زبان های دیگر به این شکل است :
در OBJECTIVE-C:
int number = 1;
در #C:
var number = 1;
در جاوا اسکریپت:
var number = 1;
شباهت های زیادی بین این زبان ها با سوئیف وجود دارد؛ تنها تفاوت آن در نبود؛ می باشد. می توانید نوع متغیر را به شکل زیر تعریف کنید:
var number: Int = 1
یک متغیر از نوع String در سوئیف به شکل زیر تعریف کنیم:
var language = “سوئیف“
همانطور که مشاهده می کنید کدنویسی مرتب تر و شبیه به #C و جاوااسکریپت است. در Objective-C به شکل زیر این کار انجام می شود:
NSString *language = @”سوئیف“;
با سوئیف، نیازی به نشانه گر های حافظه (*) و پیشوند های متغیر ها به شکل @ نیست. اگر با فریم ورک اصلی کار می کنید، می توانید با استفاده از یک NSString یک متغیر String در سوئیف را ذخیره کنید. تمامی ثابت ها Constants را در سوئیف می توان با کمک let تعریف کرد:
let language = “سوئیف“
یا
let language: String = “سوئیف“
در سایر زبان ها، این تعریف به شکل زیر انجام می شود:
Obejctive-C
NSString *const language = @”سوئیف“;
#C:
const string language = سوئیف“;
کار با متغیر ها در سوئیف با زبان های دیگر فرقی نمی کند ولی روش ساده تری برای اضافه کردن متغیرها در String دارد:
var designers = 4
var developers = 4
var teamSize = “The team has \(designers + developers) members”
آرایه ها
در سوئیف، براحتی می توانید آرایه ها و لغت نامه ها را با [ ] ایجاد کنید و از طریق نوشتن کلمه یا شاخص آن ها، به Elementهای آنها دسترسی پیدا کنید.
var arr = [“first” , “second”]
در سایر زبان ها این کار به شکل زیر انجام می شود:
Objective-C
NSArray *arr = @[@”first”, @”second”];
#C:
var arr = new[] { “first”, “second” };
جاوااسکریپت
var arr = [“first” , “second”];
می توانید با استفاده از مقادیر شاخص به یک آیتم در یک آرایه دسترسی پیدا کنید:
var order = arr[0]
بعد از تعیین مقدار :
arr[0] = “zero”
این کد در جاوا اسکریپت و #C به همین شکل است ولی در انتها یک ؛ اضافه می شود.
Obejective-C
NSString *order = arr[0];
شما می توانید با استفاده از حلقه ی for item یک آرایه را تعریف کنید:
for item in arr {
// do something
}
در زبان های دیگر، تعریف بالا به شکل زیر انجام می شود:
Objective-C
for(NSString *item in arr)
{
// do something
}
#C:
foreach (var item in arr) {
// do something
}
جاوا اسکریپت
for (index = 0; index < order.length; ++index) {
//do something
}
برای اضافه کردن یک آیتم به آرایه، از عملگر += استفاده کنید:
arr += [“fourth”]
برای ضمیمه کردن یک تابع:
arr.append(“fifth”)
لغت نامه ها:
یک لغت نامه(Dictionary) در سوئیف با کمک تعیین نوع key و نوع مقدار آن ایجاد می شود:
var dict = Dictionary()
می توانید به شکل زیر به آن مقدار بدهید:
var dict = [“MEL”: “Melbourne”, “SYD”: “Sydney”]
در سایر زبان ها، تعریف بالا به شکل زیر خواهد بود:
Objective-C
NSDictionary *dict = @{
@”MEL” : @”Melbourne”,
@”SYD” : @”Sydney”
};
#C:
var dict = new Dictionary
{
{ “MEL”, “Melbourne” },
{ “SYD”, “Sydney” }
};
برای دسترسی به مقادیر آن از فرمان زیر استفاده کنید:
var entry = dict[“MEL”]
که در سایر زبان ها می شود:
Objective-C
NSString *entry = dict[@”MEL”];
#C:
var entry = dict[“MEL”];
برای تعیین یا اضافه کردن یک آیتم جدید :
dict[“PER”] = “Perth”
که در سایر زبان ها می شود:
Objective-C
dict[@”PER”] = @”Perth”
#C:
dict[“PER”] = “Perth”;
برای استفاده مجدد از یک Dictionary :
for (cityCode, cityName) in dict {
print(“\(cityCode) : \(cityName)”)
}
متغیر citycode در خود Key و متغیر cityname مقدار را قرار می دهد.
که در سایر زبان ها به شکل زیر انجام می شود:
Objective-C
for (id key in dict) {
NSLog(@”key: %@, value: %@”, key, dict[key]);
}
#C:
foreach(var item in dict) {
var cityCode = item.Key;
var cityName = item.Value;
}
حلقه ها
تا به این جای کار، روش ایجادآیتم ها را فراگرفتیم. حالا وقت ایجاد حلقه هاست.
در ابتدا، حلقه ی For:
for var number = 1; number < 5; number++ {
//do something
}
همان طور که انتظار می رود، تا زمانی که شرط مورد نظر انجام شود، مقدار دهی ادامه پیدا می کند. Objective-C و C# نیز به همین شکل هستند با این تفاوت که آن ها نوع متغیر را مشخص نمیکنند:
for number in 1…5{
//do something
}
سوئیف متغیر عددی ایجاد می کند و به شکل خودکار با تکرار مقدار مشخص، حلقه را ادامه خواهد داد. 1….5 یک برد عددی بسته است که شامل اعداد یک تا 5 می شود.
با آرایه ای که در بالا ایجاد کردیم می توانیم Cityها موجود در آرایه را تکرار کنیم:
for city in arr {
print(city)
}
سوئیف حلقه های while و repeat را مثل #C و Objective-C و جاوا معرفی می کند:
while number < 10
{
print(number)
number++
}
متغیر بعد از While از نوع Boolean است و کد وقتی که مقدار True باشد، اجرا خواهد شد. حلقه ی Repeat به همان شکل رفتار می کند ولی کد قبل از این که شرط انجام شود یکبار اجرا می شود:
var number = 9
repeat {
print(number)
number++
}
while number<10
شرطی ها
حلقه ها در کد نویسی کار های تکراری را انجام می دهند و ifو Switch جریان را کنترل می کنند.
نوشتن if در سوئیف می تواند با پرانتز و بدون آن انجام شود؛ از هر سبکی می توانید استفاده کنید.
if city == “MEL” {
print(“Melbourne”)
}
یا
if (city == “MEL”) {
print(“Melbourne”)
}
جملات if را می توان با else if یا else ادامه داد.
if city == “MEL” {
print(“Melbourne”)
} else if city == “SYD” {
print(“Sydney”)
} else {
print(“Perth”)
}
جملات Switch با فرمان Case ادامه پیدا می کنند. این یعنی که اگر Case نتیجه True داشته باشد و اجرا شود، Case بعدی بررسی نخواهد شد. مقدار پیش فرض الزامی است.
switch city {
case “MEL”:
print(“Melbourne”)
case “SYD”:
print(“Sydney”)
default:
print(“Perth”)
}
جمله ی Case میتواند مقادیر زیادی را در خود جای دهد که با (،) از هم جدا میشوند. با سوئیف می توانید از Nsstring در یک جمله استفاده کنید؛ این کار در Objective-C امکان پذیر نبود.
توابع
توابع موضوع بسیار گسترده ای در برنامه نویسی هستند. در این جا مفاهیم پایه ای لازم برای شروع کار با آن ها را به شما آموزش میدهیم.
یک تابع در سوئیف با کلمه ی کلید func و به شکل زیر تعریف می شود:
func sayName() {
print(“Patrick”)
}
پارامتر ها در پرانتز و با تعیین نام و نوع شان به شکل زیر در توابع مورد استفاده قرار میگیرند:
func sayName(name: String) {
print(name)
}
می توانید چندین پارامتر را با کمک ، از هم جدا کنید.
func sayName(name: String, lastName: String) {
print(“\(name) \(lastname)”)
}
ایجاد یک برنامه ی iOs با سوئیف
یادگیری یک زبان برنامه نویسی جدید با نوشتن کد و ایجاد یک برنامه بخوبی انجام می گیرد. پس بیایید با هم یک برنامه ی ساده iOs با کمک سوئیف ایجاد کنیم.
برنامه به TheMovieDB که یک API هست متصل شده و لیستی از فیلم ها جدید را درخواست می کند. سپس، نتایج Json را دانلود کرده و آنها را در Dictionary و آرایه ها قرار می دهد. نهایتا، این برنامه آن ها را به شکل یک جدول نمایش خواهد داد.
برای ساده تر شدن موضوع، مراحل المنت های UI به کد و کار با کنترلر های مختلف را آموزش خواهیم داد. هم چنین به شما نشان خواهیم داد سوئیف چگونه عملیات چند گانه را انجام خواهد داد.
قبل از شروع، از وب سایت Themoviedb.org یک کلید API دانلود کنید. اگر حساب کاربری ندارید، یکی ایجاد کرده و بعد از باز کردن حسابتان، یک key در بخش API ایجاد کنید.
کد کامل این برنامه در لینک زیر قابل دانلود است.
https://github.com/sitepoint-editors/UpcomingMoviesسوئیف2
پس شروع می کنیم:
Xcode را باز کنید و یک پروژه ی جدید ایجاد کنید. یک برنامه ی Single view در بخشiOs انتخاب کنیدو next بزنید.

من اسم برنامه را upcoming movies گذاشته و سوئیف را به عنوان زبان برنامه نویسی انتخاب کرده ام.

Next بزنید و محلی را برای ذخیره کردن پروژه انتخاب کنید: حالا، یک جدول برای نمایش دادههای برنامه ایجاد کنید. این کار را با انتخاب فایل Main.storyboard در Xcode انجام دهید و یک Table view object از Object Library انتخاب کنید.

برای دسترسی به این جدول در کدها باید یک خروجی و منبع داده تعریف بشود.
فایل Storyboard را انتخاب کرده و با نگه داشتنctrl جدول را به داخل view controller منقل کنید. از منوی یاز شده گزینه ی data source را انتخاب کنید.
برای ایجاد خروجی, از منوی View>Asssitant Editor>Show assistant Editor را انتخاب کنید. جدول را انتخاب و این بار با نگه داشتن ctrl جدول را به قسمت کدنویسی منتقل کنید. یک نام برای آن انتخاب کنیدو Connect را بزنید:

برای کامل کردنUI باید یک کار دیگر انجام بدهیم. باید یک cell ایجاد کنیم تا جزییات فیلم ها به شکل متن در آن قرار بگیرد.
برای این منظور، Table view را انتخاب و در قسمت prototype مقدار 1 را وارد می کنیم. سپس Style را به subtitle تغییر داده و نامش را movieresultsCell می گذاریم:


حالا وقت آن رسیده با سوئیف کمی سرگرم شویم.
در قسمت viewController.سوئیف، کلاس را به شکل زیر تغییر دهید:
class ViewController: UIViewController {
به:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
خط های زیر را به فایل viewContrller.سوئیف اضافه کنید:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier: String = “MovieResultsCell”
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier)
cell.textLabel?.text = “Test”
cell.detailTextLabel?.text = “Test details”
return cell
}
روش اولی تعداد ردیف ها در جدول و دومی نمایش داده ها را تعریف می کند.
این بخش از کد را می توانید حذف کنید چون نیازی به آن نیست :
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
کد VeiwController. سوئیف باید به شکل زیر باشد:

برای کامل کردن فاز 1، پروژه را اجرا کنید. نتیجه ی زیر بدست می آید :

حالا وقت آن رسیده تا به API متصل شویم. این کد باید قابلیت تکرار داشته باشد. هدف این است که URL به عنوان یک پارامتر نتیجه را گرفته و در JSON در آرایه قرار بگیرد.
در فولدر مورد نظر راست کلیک کرده و New file را انتخاب کنید.

کلاس Cocoa Touch را انختاب کرده و Next بزنید. یک نام خوب به آن داده و گزینه ها را به شکل زیر تنظیم کنید :

فایل را باز کرده و کد های زیر را بعد از خط Import UIKit قرار دهید:
protocol APIControllerDelegate {
func APISucceededWithResults(results: NSArray)
func APIFailedWithError(error: String)
}
بیایید که تابع به آن اضافه کنیم:
var delegate:APIControllerDelegate?
func getAPIResults(urlString:String) {
//The Url that will be called.
let url = NSURL(string: urlString)
//Create a request.
let request = NSMutableURLRequest(URL:url!)
//Sending Asynchronous request using NSURLSession.
NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
do {
//Check that we have received data
guard let data = data else {
self.delegate?.APIFailedWithError(“ERROR: no data”)
return
}
//Call the JSON serialisation method to generate array of results.
self.generateResults(data)
}
}.resume()
}
func generateResults(APIData: NSData)
{
do {
//Serialise the API data into a json object
let jsonResult = try NSJSONSerialization.JSONObjectWithData(APIData, options: .AllowFragments)
//verify we can serialise the json object into a dictionary
guard let jsonDictionary: NSDictionary = jsonResult as? NSDictionary else {
self.delegate?.APIFailedWithError(“ERROR: conversion from JSON failed”)
return
}
//Create an array of results
let results: NSArray = jsonDictionary[“results”] as! NSArray
//Use the completion handler to pass the results
self.delegate?.APISucceededWithResults(results)
}
catch {
self.delegate?.APIFailedWithError(“ERROR: conversion from JSON failed”)
}
}
اولین تابع داده ها را از API گرفته و در صورت وجود خطا تابع APIFaiedWithError را اجرا خواهد کرد.
APIController حالا باید به شکل زیر باشد:
