自从参加工作一直在用OC做iOS开发。在2015年的时候苹果刚推出swift1.0不久,当时毕竟是新推出的语言,大家也都很有激情的学习。不过在学完后发现很难在实际项目中使用,再加上当时公司项目都是基于OC来做的开发,就把swift放一边了。
  后来也不断看到网上对swift的各种评价,有好有坏,总之是一门刚推出的语言吧。语法设计,与OC无缝衔接等存在一些问题还是可以接受的。
  自从2017年9月苹果推出swift4.0后,基本大的语法变动没有了。慢慢的有很多公司开始使用swift开发公司项目了。这也说明swift已经稳定的可以解决实际项目问题了。
  2018年因为工作变动,入职现在的公司。公司的项目是大部分基于swift开发,少量使用OC。这个时候我感觉需要系统学习下swift了。在网上搜了搜有没有比较好的swift书籍。看了很多评价发现《Swift编程权威指南》无论从入门难度还是讲解方式都挺适合我的。索性就选它了。我是用kindle看的。时间是在上下班的地铁上和下班后的休息时间。前后用时一个月左右。
  阅读这本书对我的感受还是挺多的。索性把读完的感受写下来。因为人的记忆力太弱了,一星期忘一半,二星期忘七成。我怕不写下来。半年后我基本上不记得说了都是讲什么了。
  这里讲的基本上是与OC的对比,还后后面三章的三个项目作者的开发方式对我目前开发方式的反思。
 
一、swift对比OC来说它要表达的哲学是:安全,简洁
这两点在平时的编程中无处不在,举个例子:
classDog: NSObject{
letorigin: String= "中国"
fileprivatevarname: String?
privatevarage: Int? init(_name: String?, age: Int= 1) {
self.name= name ?? "旺财"
self.age= age
}
}

  定义了一个Dog类,一个常量“origin”,当一个变量被定义成let型,则只能被赋值一次。“name”和”age”是两个可空类型的变量。重载了一个init方法,在init方法中有两个形参。“name”为可空类型,”age”的默认值为一。在init方法中将这两个变量赋值给属性。其中判断name有值就设置name,为空时设置默认值“旺财”。

  定义一个类只需这么几行代码,相比OC简洁了很多。安全上:显示标识出哪些变量可空,哪些变量不可修改。即提高了性能,又提高了安全性。
 
2.OC中的block代码块被swift中的闭包替代
在swift中,函数也是一等公民,同基本类型一样。可以做属性,函数参数,返回值自由使用。
其定义方式同OC区别很大,如:
swift定义与OC的定义
    let sum: ((Int,Int) -> Int) = {(a, b) in
returna + b
}
let res = sum(1, 2)
print(res) int(^SumBlock) (int, int) = ^(intx, inty) {
return x + y;
};
 
3.字符串使用的区别
对于平时使用较多的字符串处理,变化还是比较大的。
let str = "hello world"
var str0 = str.prefix(2)//前两个
var str1 = str.suffix(2)//后两个 let index0 = str.index(str.endIndex, offsetBy: -4)
var str2 = str[index0..<str.endIndex]//后4个 let index1 = str.index(str.startIndex, offsetBy: 4)
var str3 = str[str.startIndex..<index1]//前4个

与OC的对比

    NSString*str = @"hello world";
id str0 = [str substringToIndex:2];
id str1 = [str substringFromIndex:str.length-2];
id str2 = [str substringWithRange:NSMakeRange(2, 3)];
4.在swift中,结构体的使用非常广泛,它的作用和用法与类相似,主要区别是结构体不能被继承。所以考虑到如果类型不会被继承生成子类,都可以使用结构体替换。此外结构体嵌套也是swift与OC相比变化较大的部分。
struct Animal {
let region = "中国"
var name: String?
var color = UIColor.red init(name: String,color: UIColor) {
self.name= name
self.color= color
} struct Dog {
let legNum = 4
func run() -> String{
return"跑回家"
}
}
}
5.枚举。
swift提供的枚举比OC强大太多。枚举中可以继续定义枚举,结构体,类,方法。非常灵活。
 
enum SDCEnumType: Int{
case circle = 20
case check func enumTypeString(type: SDCEnumType) -> String{
switch type {
case .circle:
return"circle"
default:
if type.rawValue== 21{
return"check"
} else{
return"其他情况"
}
}
} enum SDCEnumSubType {
case square(SDCEnumType)
case ellipse(SDCEnumType)
}
}
 
6.swift提供的协议也是非常的灵活,可以进行协议扩展,协议继承,定于初始化方法,协议关联等。
protocol Student {
var name: String{getset}
var age: Int{get}
static func study(date:Date) -> Date init(name:String)
}
extension Student{
var score:Float{
return80.8
} }
protocol Childe:Student{ }
7.后面的Mac,iPhone,OC与Swift混合项目让我对编程过程的理解:
1.平时很少关注Mac程序开发,这本书在后面的例子中写了一个Mac应用的demo。算是对Mac应用有了一定的认识。
2.编程步骤分两步:
一,实现功能。
二,进行设计模式调整。
这个两个步骤在平时的编程中,我只是进行代码实现,对于完成功能后的设计模式优化却没有做。想想工作了这么久,编程都是只走了一半,真是汗颜。
 
8.范型的使用。
在OC中范型常用的场景是对集合内容的限制,而在swift中,范型已经涉及到函数。这样瞬间使函数的战斗力增加了10倍。
swift是强类型语言,同一个运算符两边的类型必须是一致的。
func SwapTwoValues <T> (inout a: T,inout b :T){
let tempValue = a
a = b
b = tempValue
} structIntStack{
var items = [Int]()
//压栈
mutating func push(item:Int){
items.append(item)
}
//出栈
mutating func pop()->Int{
return items.removeLast()
}
} struct Stack<Ele>{
var items = [Ele]()
mutating func push(item:Ele){
items.append(item)
}
mutating func pop()->Ele{
return items.removeLast()
}
}
 
9.在swift中,每个运算符其实也是一个函数。这个与OC比起来有着概念性的差别。
 
//前置运算符,表示2的var0次方
prefix operator ^
prefix func^ ( var0: Double) -> Double{
return pow(2, var0)
}
//后置运算符,表示var0的2次方
postfix operator ^
postfix func ^ (var0: Double) -> Double{
return var0*var0
}

Swift编程权威指南第2版 读后收获的更多相关文章

  1. Android编程权威指南第三版 第32章

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35564145/article/de ...

  2. Android编程权威指南(第三版)- 2.8 挑战练习:添加后退按钮

    package com.example.geoquiz; import android.support.v7.app.AppCompatActivity; import android.os.Bund ...

  3. 读《Android编程权威指南》

    因为去年双十二购买了一折的<Android 编程权威指南(第一版)>,在第二版出来后图灵社区给我推送了第二版的优惠码,激动之余就立马下单购买电子书,不得不说Big Nerd Ranch G ...

  4. 使用最新AndroidStudio编写Android编程权威指南(第3版)中的代码会遇到的一些问题

    Android编程权威指南(第3版)这本书是基于Android7.0的,到如今已经过于古老,最新的Android版本已经到10,而这本书的第四版目前还没有正式发售,在最近阅读这本书时,我发现这本书的部 ...

  5. Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习

    16.7挑战练习:优化照片显示 新建dialog_photo.xml 1234567891011121314 <?xml version="1.0" encoding=&qu ...

  6. 《JavaScript权威指南(第6版)(中文版)》PDF

    简介自1996年以来,JavaScript的:权威指南已为JavaScript圣经程序员,程序员指南和全面的参考,以核心语言和客户端JavaScript API的Web浏览器定义.第6版包括HTML5 ...

  7. Swift 编程风格指南(raywenderlich.com 版本号)

    官方 raywenderlich.com Swift 编程风格指南 本文版权归 raywenderlich.com .The Official raywenderlich.com Swift Styl ...

  8. 《Android编程权威指南》CriminalIntent项目梳理

    相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...

  9. 《JavaScript权威指南 第六版 中文版》(一)

    <JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...

随机推荐

  1. PostgreSQL按年月日分组

    Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...

  2. C#图片缩放平移 —— 从功能分析到编码实现

    序 一直都是在看别人的博客,查到想要的,看完后把页面一关就万事大吉了,没啥感觉:直到后来遇到了同样的问题,总想不起来咋弄,关键是还查不到以前看过的,郁闷!现在想想,还是“好记性不如烂笔头”啊,自己弄过 ...

  3. 基于.net standard 的动态编译实现

    在前文[基于.net core 微服务的另类实现]结尾处,提到了如何方便自动的生成微服务的客户端代理,使对于调用方透明,同时将枯燥的东西使用框架集成,以提高使用便捷性.在尝试了基于 Emit 中间语言 ...

  4. ffmpeg用法小结,教你抓各大网站视频

    最近受邀朋友帮忙需要抓取一段某酷电影,偶然间发现ffmpeg程序.说到此可能会有人提到you-get和youtube-dl,期间也接触了该两款程序,但是由于版权原因,该软件仅仅可以抓取前几分钟预览版, ...

  5. 忘记Oracle用户名和密码

    方法一: 看看是不是Oracle服务器没有打开 打开cmd,输入sqlplus /nolog,回车---->进入sqlplus; 输入“conn /as sysdba”:以超级管理员的方式连接数 ...

  6. OCP 052新加的考试题收集整理-第20道

    20. Which is true about the SYSTEM and SYSAUX tablespaces? A) The SYSAUX tablespace can be made read ...

  7. 该用li还是得用

    如:这样子少一层是很好,但为了美观,后面都补上a,但鼠标经过也会有背景色,所以还是得多一层li 解决后:

  8. “全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. [agc004e]Salvage Robots dp

    Description 蛤蟆国的领土我们可以抽象为H*W的笼子,在这片蛤土上,有若干个机器人和一个出口,其余都是空地,每次蛤蟆会要求让所有的机器人向某个方向移动一步,当机器人移动到出口时会被蛤蟆活摘出 ...

  10. Nginx 常用命令总结

    查看某个程序的进程:ps -aux | grep nginx (进程的名字:httpd-apahe进程 mysqld-mysql的进程 svn-svn的进程 php-fpm - PHP进程 ) 查看某 ...