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

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

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

一、文件

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

oc文件.png

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

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

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
            }
        }
    }

持续更新中。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 UI下拉刷新模糊效果A...
    袁俊亮技术博客阅读 11,899评论 9 105
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,945评论 4 60
  • 一个人所有的乡愁,最初都是来自于食物。 高中毕业以后,不时地总会看见微博和朋友圈的好友发过一些动态,说想念家乡的蒸...
    鲁慢阅读 500评论 0 2
  • 下班时,把手机放在书包里,摘掉耳机,不去思考跟自己生活有关的事情,静静地觉察着周围的一切,花草树木、小昆虫...
    李沐羲阅读 519评论 0 0
  • 是的,有个好消息和你分享,今天我很幸运的收到了一份精美的赠品。 在深圳《好女孩大学优雅智慧》的课堂上,有一个环节是...
    张习瑶阅读 435评论 0 0