Swift是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,用于搭建基于苹果平台的应用程序。作为苹果公司力推的新语言,Swift受到了广大苹果开发者的重视。当下,学习Swift,并且能够用Swift进行项目开发,已经是一名iOS开发者必不可缺的能力之一了。
最近工作进度不是很紧张,就准备把之前学习的swift语法落实到项目当中,于是作死般得想把手头上负责的一个oc语言的iOS项目,转换成swift语言,一来可以检测自己的学习情况,二来可以为以后的swift开发打下基础。接下来就总结一下转换中的心得吧。
一、文件
oc项目中的每个类是有.h和.m两个文件组成,.h表示头文件,用来声明各种成员变量,方法,属性之类的。在import的时候用头文件。.m 主要用来实现.h 里声明的方法。
Swift项目中的每个类只有一个.swift文件,声明和实现都在.swift文件中。而且你会发现类与类之间的调用,完全不需要加头文件了,而是天然地拥有当前模块的所有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语言:
//转换成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语言喜欢用类名的后缀来作为系列初始化方法的开头,所以对于系统类库,我们一般用写类的后缀来让xCode帮我们联想到方法;
Swift语言化简了一长串的类名,用参数名来传达语意,我们可以写出类名,然后再打一个左括号"(",xCode就会帮我们联想出所有的构造函数。
三、对self的简化
这个比较抽象,举个例子吧:在使用自己的导航控制器的时候,oc中一定要指明是self.navigationController;而Swift中直接navigationController
//oc写法
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//转换成swift的写法
navigationController?.navigationBar.barStyle = UIBarStyle.black
四、项目的宏定义文件
在中大型项目中,我们需要将一些常用变量或者方法的宏定义,方便在多个文件中使用。oc语言中可以直接创建一个头文件,用宏定义#define;Swift语言中是不能使用宏定义语法的,但是因为命名空间的缘故,我们可以给我们的项目添加一个空的Const.swift文件,在其中,我们将原本oc中不需要接受参数的宏,定义成let常量,将需要接受参数的宏定义成函数即可,由于我们的整个项目共享命名空间,我们就可以在项目内的任何地方直接使用Const.swift中定义的这些公共的常量和函数。
1、没有参数的宏
//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
//转换成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、接收参数的宏
//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]
//转换成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)
}
五、类的扩展
在oc语言中,我们经常使用类别来为现有的类添加新的方法。举一反三,我也新建文件的时候,选择创建Swift File,可是没有看到下图所示的,和oc语言一样的File Type选择,让我一时不知所措。后来仔细思考之后,发现swift的扩展extension和OC的类别是如出一辙。
而至于oc的扩展,只是对某个类的接口进行扩展,这个是我们用的比较多的,一般我们习惯在.m文件中添加扩展,然后把一些私有的、不想让外部访问的接口和属性定义在这里;swift根本不需要类似OC扩展的东西。因为swift只有一个文件呀。它的所有的东西都在class内。
这样分析之后就很清楚了,我们只需要选择Swift File创建一个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的控件数据绑定
做过iOS开发的同学们肯定都对TableView不陌生吧,在项目开发中,我们不免要自定义一个UITableViewCell的子类,然后传进来一个数据模型或者字典,根据数据对控件进行数据绑定,展示不同的数据内容。
oc语言中,我们将数据模型定义成类的强指针成员变量,然后重写set方法去实现:
@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语言中,我们通过属性观察器实现:
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
}
}
}
持续更新中。。。。