Swift是蘋果于2014年WWDC(蘋果開發(fā)者大會)發(fā)布的新開發(fā)語言,用于搭建基于蘋果平臺的應(yīng)用程序。作為蘋果公司力推的新語言,Swift受到了廣大蘋果開發(fā)者的重視退敦。當(dāng)下,學(xué)習(xí)Swift蚣抗,并且能夠用Swift進(jìn)行項(xiàng)目開發(fā)侈百,已經(jīng)是一名iOS開發(fā)者必不可缺的能力之一了。
最近工作進(jìn)度不是很緊張翰铡,就準(zhǔn)備把之前學(xué)習(xí)的swift語法落實(shí)到項(xiàng)目當(dāng)中钝域,于是作死般得想把手頭上負(fù)責(zé)的一個oc語言的iOS項(xiàng)目,轉(zhuǎn)換成swift語言锭魔,一來可以檢測自己的學(xué)習(xí)情況例证,二來可以為以后的swift開發(fā)打下基礎(chǔ)。接下來就總結(jié)一下轉(zhuǎn)換中的心得吧迷捧。
一织咧、文件
oc項(xiàng)目中的每個類是有.h和.m兩個文件組成伐割,.h表示頭文件草添,用來聲明各種成員變量榜配,方法馋没,屬性之類的。在import的時候用頭文件上忍。.m 主要用來實(shí)現(xiàn).h 里聲明的方法怒见。
Swift項(xiàng)目中的每個類只有一個.swift文件拱层,聲明和實(shí)現(xiàn)都在.swift文件中。而且你會發(fā)現(xiàn)類與類之間的調(diào)用绿渣,完全不需要加頭文件了朝群,而是天然地?fù)碛挟?dāng)前模塊的所有class燕耿,非常方便中符。
二、對象初始化
oc語言:
//oc寫法
UIColor *color1 = [[UIColor alloc] init];
UIColor *color2 = [UIColor colorWithRed:243/255.0 green:243/255.0 blue:243/255.0 alpha:1.0];
Swift語言:
//轉(zhuǎn)換成swift的寫法
let color1: UIColor = UIColor()
let color2: UIColor = UIColor(red: 243/255.0, green: 243/255.0, blue: 243/255.0, alpha: 1.0)
1誉帅、oc語言的最簡單的初始化對象是用 [[Class alloc] init] 或者[Class new]淀散;Swift最簡單初始化只需要Class()。
2蚜锨、oc語言喜歡用類名的后綴來作為系列初始化方法的開頭档插,所以對于系統(tǒng)類庫,我們一般用寫類的后綴來讓xCode幫我們聯(lián)想到方法亚再;
Swift語言化簡了一長串的類名郭膛,用參數(shù)名來傳達(dá)語意,我們可以寫出類名氛悬,然后再打一個左括號"("则剃,xCode就會幫我們聯(lián)想出所有的構(gòu)造函數(shù)。
三如捅、對self的簡化
這個比較抽象棍现,舉個例子吧:在使用自己的導(dǎo)航控制器的時候,oc中一定要指明是self.navigationController镜遣;而Swift中直接navigationController
//oc寫法
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//轉(zhuǎn)換成swift的寫法
navigationController?.navigationBar.barStyle = UIBarStyle.black
四己肮、項(xiàng)目的宏定義文件
在中大型項(xiàng)目中,我們需要將一些常用變量或者方法的宏定義悲关,方便在多個文件中使用谎僻。oc語言中可以直接創(chuàng)建一個頭文件,用宏定義#define寓辱;Swift語言中是不能使用宏定義語法的戈稿,但是因?yàn)槊臻g的緣故,我們可以給我們的項(xiàng)目添加一個空的Const.swift文件讶舰,在其中鞍盗,我們將原本oc中不需要接受參數(shù)的宏,定義成let常量跳昼,將需要接受參數(shù)的宏定義成函數(shù)即可般甲,由于我們的整個項(xiàng)目共享命名空間,我們就可以在項(xiàng)目內(nèi)的任何地方直接使用Const.swift中定義的這些公共的常量和函數(shù)鹅颊。
1敷存、沒有參數(shù)的宏
//oc中的宏定義
#define IS_IOS7LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 ? YES : NO)
#define IS_IOS8LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ? YES : NO)
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
//轉(zhuǎn)換成swift的寫法
let IS_IOS7LATER = Double(UIDevice.current.systemVersion)! >= 7.0 ? true :false
let IS_IOS8LATER = Double(UIDevice.current.systemVersion)! >= 8.0 ? true :false
let kScreenHeight = UIScreen.mainScreen().bounds.size.height
let kScreenWidth = UIScreen.mainScreen().bounds.size.width
2、接收參數(shù)的宏
//oc寫法
#define RGB_COLOR(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
#define RGBA_COLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]
#define HEX_RGB_COLOR(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
#define HEX_RGBA_COLOR(rgbValue,a) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0x00FF00) >> 8))/255.0 blue:((float)(rgbValue & 0x0000FF))/255.0 alpha:a]
//轉(zhuǎn)換成swift的寫法
func RGB_COLOR(r:CGFloat,_ g:CGFloat,_ b:CGFloat) -> UIColor
{
return UIColor(red: (r)/255.0, green: (g)/255.0, blue: (b)/255.0, alpha: 1.0)
}
func RGBA_COLOR(r:CGFloat,_ g:CGFloat,_ b:CGFloat,_ a:CGFloat) -> UIColor
{
return UIColor(red: (r)/255.0, green: (g)/255.0, blue: (b)/255.0, alpha: a)
}
func HEX_RGB_COLOR(rgbValue:Int) -> UIColor
{
return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0, green: CGFloat((rgbValue & 0xFF00) >> 8)/255.0, blue: CGFloat((rgbValue & 0xFF))/255.0, alpha: 1.0)
}
func RGB_COLOR(rgbValue:Int,_ a:CGFloat) -> UIColor
{
return UIColor(red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0, green: CGFloat((rgbValue & 0xFF00) >> 8)/255.0, blue: CGFloat((rgbValue & 0xFF))/255.0, alpha: a)
}
五、類的擴(kuò)展
在oc語言中锚烦,我們經(jīng)常使用類別來為現(xiàn)有的類添加新的方法觅闽。舉一反三,我也新建文件的時候涮俄,選擇創(chuàng)建Swift File,可是沒有看到下圖所示的蛉拙,和oc語言一樣的File Type選擇,讓我一時不知所措彻亲。后來仔細(xì)思考之后孕锄,發(fā)現(xiàn)swift的擴(kuò)展extension和OC的類別是如出一轍。
而至于oc的擴(kuò)展苞尝,只是對某個類的接口進(jìn)行擴(kuò)展,這個是我們用的比較多的畸肆,一般我們習(xí)慣在.m文件中添加擴(kuò)展,然后把一些私有的宙址、不想讓外部訪問的接口和屬性定義在這里轴脐;swift根本不需要類似OC擴(kuò)展的東西。因?yàn)閟wift只有一個文件呀抡砂。它的所有的東西都在class內(nèi)大咱。
這樣分析之后就很清楚了,我們只需要選擇Swift File創(chuàng)建一個swift文件就可以了舀患,然后用extension來為已有的類添加方法徽级。
extension UIColor {
// 便利初始化方法
convenience init(r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat = 1.0) {
self.init(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: a)
}
convenience init(rgbValue: Int, a: CGFloat = 1.0) {
self.init(red: CGFloat((rgbValue & 0xFF0000) >> 16)/255.0, green: CGFloat((rgbValue & 0xFF00) >> 8)/255.0, blue: CGFloat((rgbValue & 0xFF))/255.0, alpha: a)
}
}
六、自定義UITableViewCell的控件數(shù)據(jù)綁定
做過iOS開發(fā)的同學(xué)們肯定都對TableView不陌生吧聊浅,在項(xiàng)目開發(fā)中餐抢,我們不免要自定義一個UITableViewCell的子類,然后傳進(jìn)來一個數(shù)據(jù)模型或者字典低匙,根據(jù)數(shù)據(jù)對控件進(jìn)行數(shù)據(jù)綁定旷痕,展示不同的數(shù)據(jù)內(nèi)容。
oc語言中顽冶,我們將數(shù)據(jù)模型定義成類的強(qiáng)指針成員變量欺抗,然后重寫set方法去實(shí)現(xiàn):
@property (nonatomic, strong) Video *video;
- (void)setVideo:(Video *)video
{
_video = video;
self.screenShotImageView.image = [UIImage imageNamed:video.imageName];
self.titleLabel.text = video.title;
self.sourceLabel.text = video.source;
}
Swift語言中,我們通過屬性觀察器實(shí)現(xiàn):
var video: Video?{
didSet {
if let imageName = video?.imageName,
let title = video?.title,
let source = video?.source {
screenShotImageView.image = UIImage(named:imageName)
titleLabel.text = title
sourceLabel.text = source
}
}
}
持續(xù)更新中强重。绞呈。。间景。