项目从Objective-c转为Swift过程总结

Swift是苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,用于搭建基于苹果平台的应用程序。作为苹果公司力推的新语言,Swift受到了广大苹果开发者的重视。当下,学习Swift,并且能够用Swift进行项目开发,已经是一名iOS开发者必不可缺的能力之一了。

最近工作进度不是很紧张,就准备把之前学习的swift语法落实到项目当中,于是作死般得想把手头上负责的一个oc语言的iOS项目,转换成swift语言,一来可以检测自己的学习情况,二来可以为以后的swift开发打下基础。接下来就总结一下转换中的心得吧。

一、文件

oc项目中的每个类是有.h和.m两个文件组成,.h表示头文件,用来声明各种成员变量,方法,属性之类的。在import的时候用头文件。.m 主要用来实现.h 里声明的方法。

《项目从Objective-c转为Swift过程总结》 oc文件.png

Swift项目中的每个类只有一个.swift文件,声明和实现都在.swift文件中。而且你会发现类与类之间的调用,完全不需要加头文件了,而是天然地拥有当前模块的所有class,非常方便。

《项目从Objective-c转为Swift过程总结》 swift文件.png

二、对象初始化

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];

《项目从Objective-c转为Swift过程总结》 oc语言初始化提示方法.png

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)

《项目从Objective-c转为Swift过程总结》 Swift构造函数提示方法.png

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的类别是如出一辙。

《项目从Objective-c转为Swift过程总结》 oc语言选择文件类型.png

而至于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
            }
        }
    }

持续更新中。。。。

    原文作者:背靠背的微笑
    原文地址: https://www.jianshu.com/p/0e6da4423a6d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞