前言
最早接触swift的时候是swift2.0,现在已经到了swift4.0了。可惜的是项目中一直没有机会使用swift,但最近回顾swift的时候发现swift确实有很多优点。swift是一门强类型的语言,它有类型推断、它的语法提供尽量精简的表达方式,闭包的形式一简再简,化繁为简。
例如:类型推断,因为你给变量赋值了,那么其实你的类型就是变量的类型,我能根据已有的信息推断出需要的信息。
为了更好的加深对swift的印象,从语法入手,对比oc,并做总结。
- swift只有常量和变量。
声明变量用var,常量用let,如果一个值不需要变化的话,那么就把它声明为常量。无论是常量和变量在使用前都必须初始化,否则会编译报错。
//swift不需要添加“;”,系统自动识别
let item0 = 1 //系统自动推断出类型为int
let item1:Int = 1 //注明类型
var item2 = 1
var item3:String = "hello swift"
具备oc没有的类型推断,起到简化代码的效果。同时它隐含着对开发者的要求,要清楚自己赋值的变量类型。
- 可选类型
swift提供可选类型来处理值存在缺失的情况。例如你定义一个常量,如果在它的使用期间有可能会为空,那么就有必要把这个常量定义为可选类型。
var item:Int? //定义为可选类型。没有显式赋值,默认赋值为nil
swift真机智,又提醒开发者需要搞清楚这个变量会不会存在缺失。
更机智的是,你使用这个值的时候也要考虑几种情况。
1.当不清楚它是否有值的情况下,获取它的时候可以直接使用变量名,例如print(item)
2.当明确知道它有值的情况下,使用强制解析(变量后面添加!),如print(item!)。但是如果这个值为nil,使用tiem!就会出现异常。
然后为了区分这两种情况,可以通过if进行判断,这里又有一个叫做可选绑定的概念。
var item:Int?
//普通的if判断
if item != nil
{
print(tiem!)
}
else
{
//不操作,反正是为nil
}
//可选绑定
//temp只做输出作用,如果item赋值给temp有值,那么进入第一个分支,temp只做输出作用,不需要再进行强制解析。
if let temp = item
{
print(temp)
}
else
{
}
从语法的角度来分析,要避免使用item!且item = nil 的情况,因为这种情况会导致程序崩溃。但是从swfit的设计思想和开发者的角度来看,要更清楚每个常量变量的作用、生命周期会不会存在为空的情况等。使用强制解析的时候,必须确保有值。
相对可选类型,另外有一个隐式解析可选类型
如果你总能确定这个常量在它的生命周期中一定有值,那么就没有必要每次都进行if判断或者可选绑定,这样是非常低效的。直接把类型定义为隐式解析可选类型。
形如:
//可选绑定
var item0:Int? = 1
let temp0 = item0!
//隐士解析可选绑定,问号变成感叹号
var item1:Int! = 1
//直接解析,不需要感叹号
let temp1 = item1
小结
通过分析可选类型、可选绑定、隐式解析可选类型、变量的获取等用法,去思考下swift为什么要这么设计。能感觉到swift尽量通过语法层面的东西,对开发者有更高的要求,至少在编码的层面要更清楚自己定义的每一个东西,它的作用是怎么样的,会存在什么情况,使用的时候的状态是有值还是没值等等。
待续~