Swift优缺点

Swift和OC共用一套运行时环境,Swift的类型可以桥接到OC,反之亦然。两者可以互相引用混合编程。
Swift新出的一些新兴概念,这些是OC没有的,比如泛型、元组等。
优点

  1. 简洁的语法,性能较好
    swift比OC精简,整个项目少了.h文件,以及头文件的引入,效率提升1.3倍。
  2. swift更加安全
    类型安全的语言,可选类型,强制解包等 if letguard let
  3. 定义变量简单
    定义变量不区分整型,浮点型等,变量使用var,常量使用let。
  4. 函数式编程的支持
    filter,map,reduce,flatMap,compactMap等。
    swift本身提供了对函数式编程的支持,OC本身是不支持的,需要引入ReactiveCocoa这个库才支持。
  5. 可视化互动效果
    开发工具带来了Xcode Playgrounds功能,该功能提供强大的互动效果,能让swift源代码在撰写过程中实时显示出其运行结果。
  6. 精准报错
    报错的时候直接显示报错行。

缺点

  1. 版本不稳定。
  2. 使用比例偏低。
  3. swift开源库较少,不过正在改变中。
  4. App体积变大,多出5~8M,由于版本不稳定,iOS系统库中并没有包含swift的运行库,反而是每个App都要包含其对应的swift运行库。
  5. 公司使用比例不高,很多公司以稳为主,很少一些在进行混合开发,更少一些是swift开发。
  6. 纯swift的运行时和OC有本质区别,一些OC中强大的运行时功能,在纯swift中变无效了。

1. swift可选类型

swift引入可选类型,用于处理变量值不存在的情况,Optionals类似于OC中指向nil的指针,但是适用于所有数据类型,而非仅仅局限于类,Options相比于OC中nil指针,更加安全和简明,并且也是Swift诸多强大功能的核心。

2. swift中泛型

解决代码复用问题
例如两个方法类似,主要是参数类型的区别

func isIntEqual(x: Int, y: Int) -> Bool {
    return x == y
}

func isStringEqual(x: Int, y: Int) -> Bool {
    return x == y
}

可以利用泛型合并一下:

func isObjEqual<T: Equaltable>(x: T, y: T) -> Bool {
    return x == y
}

当使用时,如果将两个不同类型的数进行比较,编译器会马上提醒我们,从而快速避免这种情况。

3. 访问权限变更

swift新增两种权限,fileprivate,open,权限更细化。
open、public、internal(默认)、fileprivate、private
开放权限依次从大到小

  • open:可以被任何人使用,包括override和继承。
  • public:可以被任何人访问,但其他module中不可以被override和继承,在本module中可以被override和继承。
  • internal:系统默认访问级别,internal修饰符可写可不写,访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
    如果是框架或者库代码,则整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
    如果是App代码,也是在这个App代码,也是整个App内部可以访问。
  • fileprivate:表示这个元素的访问权限为文件内私有,包括extension时可以访问
  • private:只在当前类或结构体的作用域可访问。

4.Swift便捷的函数式编程

4.1、map

var values = [1, 3, 5, 7]
let result = values.map( { (element) -> Int in
    return element * 2
}) // [2, 6, 10, 14]

4.2、filter

var result = [1, 3, 5, 7, 9]
let flattenResult = result.filter{ $0 % 3 == 0 }
// [3, 9]

4.3、reduce

var result = [1, 3, 5]
let initialResult = 10
var reduceResult = values.reduce(initialResult, combine: { $0 + $1 })
print(reduceResult) // 10 + 1 + 3 + 5 = 19

4.4、flatMap(合并集合)

let arrayNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(arrayNumbers.flatMap{ $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(arrayNumbers.flatMap{ $0.map{ $0 *10 } }) // [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(arrayNumbers.flatMap{ $0.filter{ $0 > 4 } }) // [5, 6, 7, 8, 9]

4.5、compactMap(过滤空值)

let names: [String?] = ["zhangsan", nil, "lisi", "wangwu", nil, "zhaoliu"]
print(names.count) // 6
print(names.compactMap{ $0 }) // ["zhangsan", "lisi", "wangwu", "zhaoliu"] 过滤了空值

// 打印不是空值的字符串的个数
print(names.compactMap{ $0?.count }) // [8, 4, 6, 7]

5. Swift独有的元组类型

元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求相同类型。

var value = (Int, String) = (x: 15, y: "abc")

6. Swift中使用let定义常量,var定义变量

使用常量,更加安全,不能够被修改。
在需要对对象进行修改的时候,只能用var修饰。

7. 细节使用区别

  1. swift不区分.h和.m,一个类只有.swift一个文件,所以整体的文件数量比起OC有一定的减少。
  2. swift句尾不需要分号,除非想在一行中写三行代码,加分号隔开。
  3. swift数据类型都会自动判断,只区分常量let和变量var。
  4. 强制类型转换格式不同,OC强转:(Int)a。swift:Int(a)。
  5. 关于BOOL类型更加严格,swift不再是OC的非0就是真,而是true才是真,false才是假。
  6. swift循环语句中必须加{},就算只有一行也要加。
  7. swift的swift语句后面可以跟各种数据类型,如Int,字符串都行,并且里面不需要写break。
  8. swift if后的括号可以省略,if a > b {},而OC里if后面必须写括号。
  9. swift打印用 print("")打印变量可以 print("(value)")不用像oc一样写很多%d,%@等。
  10. swift的【Any】可以代表任意类型的值,无论是类、枚举、结构体还是其它swift类型,这个对应OC中的【id】类型。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容