学习swift心得和总结

Swift

一、Swift趋势

虽然还处于过渡时期,但趋势很明朗了,Swift 必然会替代 Objective-C,并且比想象中来得快。现在就应该做好准备了。假如之前已经掌握了 Objective-C,切换到 Swift 也不难。Swift 中很多概念在 Objective-C 中已经存在。随着时间推移,Swift 在整个 iOS/Mac 工程中占的代码比例会越来越多,而 Objective-C 作为粘合层还是会存在。

二、Swift优缺点

用Swift的经验尚浅,所以都是一些比较浅薄的理解,后面有更深刻的理解再补上。

优点:

  1. 代码简洁。类的声明和实现在一个文件中。
  • 统一对属性和方法的调用,都用.。
  • 如果不加额外的访问控制,所有的符号都是整个项目可见,无需考虑头文件的问题。
  1. 结合playground,做到真正意义上的所见即所得
  2. 字符串处理太方便了。
//字符串比较和拼接实在是太方便了
let foo = "abc"
let bar = "abc"

if foo == bar {
   //blablabla
}

print("====\(foo)+\(bar)")

  1. 语言上支持延迟加载。
lazy var imageView : UIImageView = {
   var imageView = UIImageView(image: UIImage(named: "empty_hint"))
   imageView.contentMode = .ScaleAspectFit

   return imageView
}()

lazy var infoLabel : UILabel = {
   var infoLabel = UILabel()
   infoLabel.lineBreakMode = .ByWordWrapping //支持换行
   infoLabel.numberOfLines = 0

   return infoLabel
}()

lazy var button : UIButton = {
   var button = UIButton()
   button.titleLabel?.font = UIFont.systemFontOfSize(15)
   button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
   button.setBackgroundImage(UIImage(named: "buy_instance_hint_button"), forState: .Normal)
   button.hidden = true

   return button
}()

  1. 多返回值。比如下面这个函数,如果使用Objective-C写还是比较麻烦的。
//将 "创建中&#FA8C35" 翻译成对应的 "(字符串对象, 颜色对象)"
func YWSTranslateRichText (str : String) -> (text : String, color : UIColor) {
   let statusArray = str.componentsSeparatedByString("&")

   if statusArray.count == 0 {
       return ("", UIColor.lightGrayColor())
   }

   if statusArray.count == 1 {
       return (statusArray[0], UIColor.lightGrayColor())
   }

   return (statusArray[0], UIColor.fromHexString(statusArray[1]))
}

//使用方式如下
let (text, color) = YWSTranslateRichText(instanceStatusConf)
  • 支持字符串作为枚举值。
enum YWSECSInstanceStatus : String {
   case Starting = "Starting"
   case Running = "Running"
   case Stopping = "Stopping"
   case Stopped = "Stopped"
}

//使用方法
cell.ECSInstanceStatus = YWSECSInstanceStatus(rawValue: instanceStatus!)

//转换成字符串
textDetailLabel.text = YWSECSInstanceStatus.Starting.rawValue

缺点:

  • Swift灵活性非常大,既能用OP,又能用OO,语法写法还比较多样化,所以团队项目合作中必须注意,尽量能统一风格,否则会导致一片乱~
  • Optional让人头疼,大量的?和!,没处理好很容易导致崩溃。
  • 强类型和Optional,给JSON解析带来了灾难。
  • 目前Xcode不支持对Swift写的代码做重构。
  • Build Settings里面设置Treat Warnings as Errors对Swift代码无效。
  • Swift不支持宏,OC里面比较常用的宏,比如下面这个UIColorFromRGB就没法用了。
#define UIColorFromRGB(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]
  • 不支持与C++混编,必须通过OC包一下C++的接口,Swift才能使用。使用一些跨端的C++库(OpenGL、全文搜索、网络底层等)比较麻烦。
  • Swift的错误信息非常不准确,难以准确定位

  • 用private修饰的类,如果使用KVC来给属性设置值,编译不会报错,运行时也不会报错,但就是设置不上。去掉private就好了。
  • Swift和OC混着写的时候,有时候会出现OC的类在CloudConsoleApp-Bridging-Header.h里面提供给Swift使用,但是这个类又需要引入CloudConsoleApp-Swift.h使用Swift的一些功能,这样就循环包含了,没法玩下去了。

Swift代码规范指南

三、资源整理

1.苹果官方资源

  1. 苹果官方为开发者提供的Swfit学习资源:https://developer.apple.com/swift/resources/

    14998280519388.jpg

    • 《The Swift Programming Language》中文版 | PDF版
      对Swift的各个特性都做了详细的说明,是Swift的官方权威解释

    • 《Using Swift with Cocoa and Objective-C》中文版
      介绍了Swift和OC如何互相调用和一些需要注意的地方
      中文手册:

  1. Swfit的官方网站:https://swift.org
    这里会介绍Swift的开源阶段成果和一些使用指导,Swift的官方博客和Swift的一些动向信息可以在这里看到

    14998282182999.jpg

  2. Github上的官方资源是swift-evolution
    可以在这个库里看到Swift的最新进度。因为Swift是一门开源的语言,你可以在这里按照一定格式提出改进的建议。

    14998284728990.jpg

2. 第三方资源

这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排。http://dev.swiftguide.cn

这个仓库“汇集了Swift语言主流学习资源,并以开发者的视角整理编排”。不得不说整理的非常的用心,也很全面。美中不足的是对于一个刚入门的开发者忽然看到收集的这么多资源可能会不知从何下手。需要好好找出一些适合自己的资源。


14998290319120.jpg

从开发者角度介绍被广泛运用于实际Swift项目中的开源库。

这个仓库筛选了被广泛应用在Swift项目中的优质开源库。并且尝试整理一些这些流行的库的相关资源。如果你打算用Swift开发一个实际项目,希望这个仓库里收集的库会对你有参考意义。


14998292881840.jpg
  • 还有一个值得一提的是SwiftGG翻译组:http://swift.gg 。定期会翻译Swift的相关文章,对于日常的学习精进也很有帮助。
    14998295823327.jpg

视频

  • 斯坦福课程Stanford University: Developing iOS 8 Apps with Swift(中文字幕版 By @网易公开课)
    14998416372889.jpg

书籍

推荐objccn出版的几本书:《Swift开发者必备Tips》、《函数式Swift》、《Swift进阶》。这几本书都很有很高的质量,对于提高对Swift的掌握很有帮助。


14998296960300.jpg

14998297218773.jpg

优秀Swift开发者推荐

如果你还使用微博的话我有几个优秀的Swift开发者推荐给你:

  • @StackOverflowError,被apple多次推荐的pin的开发者。知乎专栏地址:https://zhuanlan.zhihu.com/cocoanotes

  • @an00na,微博著名第三方客户端墨客开发者。

  • @图拉鼎,独立开发者。iOS 作品:@奇点微博客户端。

  • @没故事的卓同学

优秀网站推荐

  1. 辅助将旧的 Objective-C 代码转成 Swift Swiftify | Objective-C to Swift Converter
    14998428932894.jpg
  2. swiftmi
    致力于打造一个国内专业的Apple Swift交流和分享地方
    14998450192866.jpg

四、项目实战之混编

简介


  1. 混编无非两种情况:

    • 在Objective - C工程或者文件使用Swift的文件
    • 在Swift工程或者文件使用Objective - C文件
  2. 在混编的过程中最重要的两个文件:

    • 桥接文件:
      桥接文件ProjectName-Bridging-Header.h,在首次创建其他文件的时候,会自动生成。如果不小心删除后,也可以手动添加,不过名字必须是工程名-Bridging-Header.h,如果名字记不清也可以自己新建Header file后,在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Bridging Header配置文件路径,这个文件主要是Swift使用OC类时使用。

    • Objective-C Generated Interface Header Name文件
      这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在Targets-->Build Settings-->Swift Compiler - General-->Objective-C Generated Interface Header Name进行配置,默认文件名是工程名-Swift.h,一般不做改动。

使用


  • Swift使用Objective-C

这种情况占绝大多数。只需要在ProjectName-Bridging-Header.h这个头文件中包含相关的头文件就行。

pod组件另外一种引入的方式是通过#import引入。
比如SDWebImage可以通过下面两种方式引入。

//在Bridging头文件包含下面这个头文件
#import <SDWebImage/UIImageView+WebCache.h>

//另外一种办法,在Swift文件中引入。
import SDWebImage

Objective-C写的类和方法都会被改成Swift的使用方式,下面是两个很典型的例子。使用的时候需要尝试一下才能找到翻译的Swift方法。

//Objective-C
titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
titleLabel.numberOfLines = 0;

//Swift
cell.nameLabel?.lineBreakMode = .ByWordWrapping //全写是 NSLineBreakMode.ByWordWrapping
cell.nameLabel?.numberOfLines = 0

//Objective-C
UIImage *image = [UIImage imageNamed:@"abc"];

//Swift
let image = UIImage(named: "abc")
  • Objective-C使用Swift

当在OC文件中调用Swift文件中的类的时候,首先在OC文件中要加上 #import "ProjectName-swift.h"

这个文件虽然在工程中看不到,但是它真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码。
引入后,具体类的使用,直接按照OC的方式使用即可

混编注意事项


  1. 对于需要混编的Swift类添加@objc声明或继承NSObject或NSObject的子类
class TestClass
{
// 属性
// 实现
}

如果要在Objective-C类中使用TestClass类,应当使用@objc加以声明,或者将TestClass继承自NSObject或NSObject的子类,否则,引入ProductName-Swift.h之后,程序找不到对应类。

  1. 使用第三方Framework
    设置: target-->build setting -->Packaging -->Defines Module为 “Yes”;
    然后,配置文件Target -> Build Phases -> Link Binary,添加要导入的Framework;
    最后,还是要配置桥接文件,比如要使用 abc-lib.framework库中的 abc.h 就要这样配置:#import"abc-lib/abc.h";
    Subclass子类问题

  2. 对于自定义的类而言,Objective-C的类,不能继承自Swift的类,即要混编的OC类不能是Swift类的子类。反过来,需要混编的Swift类可以继承自OC的类。 注解

  3. OC宏文件
    如Swift文件要使用OC中定义的宏,只能使用常量简单宏文件。

  1. Swift中使用OC的block

Swift 2.* :Swift中使用闭包Closure不能使用Block作为属性进行传值,必须是初始化方法或函数。

Objective-C文件中:

typedef void (^Myblock)(NSString *arg); 

@interface FirViewController : UIViewController 

@property (copy, nonatomic) Myblock myBlock; 
//Swift 2.*版本,这种作为公共参数的形式,如果在Swift类中去回调的话,是有问题的。提示没有初始化方法,所以使用下面的以Block为参数的方法 

- (void)transValue:(Myblock) block

@end

下面是.m文件

- (void)transValue:(Myblock)block{ 
    if (block) { 
       block(@"firBack"); 
    } 
} 

在Swift文件回调:

@IBAction func goFirstAction(sender: AnyObject) { 
       let firVC:FirViewController = FirViewController() 
       firVC. transValue { ( arg:String !) -> Void in 
           self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
       } 
       self.navigationController?.pushViewController(firVC, animated: true) 
   }

经测试现在swift版本已经支持

firVC?.myBlock = { (arg) -> Void in
      //....  
}

五、问题解答

1. 那是不是 Objective-C 就不需要学习呢?

并非如此。Swift 还没有很好地解决好跟 C 和 C++ 混编的问题。很多项目底层核心库会采用 C/C++,界面和大部分逻辑采用 Swift 编写,需要 Objective-C 作为粘合层。另外还存留很多库是用 Objective-C 编写的,使用这些库需要一定 Objective-C 知识。

2. 为什么要选择swift?

  • 很多人现在还没有学习 Swift, 觉得它没有什么优点,只是一个语言大杂烩。只是等你真正使用 Swift 编写一两个项目,就回不了头。Swift 有些简便快速的写法,在 Objective-C 中是没有办法做到的。并且 Swift 的一些语言特性避免了很多 Objective-C 的坑。使用 Swift 编写的任何功能,使用 Objective-C 也可以做到,但是会麻烦得多。而假如太麻烦的话,明知道是好的,也不会去做。

  • 很多事情,你还没有见识过的时候,会觉得不需要。但等你真正接触过了,就难以忍受再次失去了。比如几年前项目还没有采用 ARC。现在看来假如没有 ARC,代码写起来太麻烦了,那时还没有更先进的写法,根本不会有这样的感觉。Swift 比 Objective-C 先进。现在 Swift 还不稳定,语言、库、相关工具将会快速变动,而这恰好说明它在发展。

3. 公司项目开发怎么选择

很多大公司为求稳,会仍然采用 Objective-C。而个人开发者和小团队,新项目应该直接采用 Swift 编写,旧项目的新模块也应该使用 Swift 编写。这样慢慢将整个语言重心从 Objective-C 切换到 Swift。Swift 的代码更简洁,开发效率更高。原有 Objective-C 项目,已经使用 Objective-C 编写的比较稳定的库,不需要也不建议要用 Swift 重新编写,直接混编,让它慢慢过渡就行了。大公司倾向于不犯错,求稳。 个人开发者和小团队,求稳一定不能跟大公司竞争的,更应该求好求变。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,618评论 4 59
  • 人之中年,父母子女一家老小,辛苦是自然的事情,也是最能懂得亲情温暖的时期了。 所谓父母子女一场,就是我看着你的背影...
    余罪说阅读 301评论 0 2
  • 无尽的原野, 踩着天的鞋, 不停地向远处奔跑着, 殊不知,身后已是满眼看不完的绿海, 也许这就是爱情的力量吧。
    我是小香菇阅读 189评论 0 0
  • 你有没有得过一种病,这个病叫做舍不得丢东西。 我承认,我有这个病,而且还没好。 有一部纪录片叫《三百六十五天的简单...
    Nikkibetter阅读 375评论 0 0
  • It is not necessary to travel to other places to learn ab...
    西西Stella阅读 122评论 0 0