一、在学基本语法以前,简单看一下与OC的不一样程序员
注释:OC #pragma marks 视图加载完成安全
Swift //MARK: 视图加载完成闭包
//TOOO:设置背景颜色(Xcode 8.0 特有)ide
//FIXME:更改头像函数
建立一个视图View:spa
OC [[UIView alloc]initWithxxx:];指针
Swift UIView(xxx:)调试
类名() == alloc/init 等价code
类方法:对象
OC [UIColor redColor];
Swift UIColor.red
2.0 UIColor.redColor
访问当前对象的属性,Swift能够不使用self.:
OC [self.view addSubview:v];
Swift view.addSubview(v)
建议:都不用,在编译器提示的时候再添加,会对语境有更好的体会
缘由:闭包(相似OC block),须要使用self.
没有";"
";"目的分割语句的,在Swift中,默认不须要
枚举类型:
OC UIButtonTypeContactAdd
Swift ‘.’contactAdd
监听方法
OC @selector
Swift #selector 若是带参数不使用‘:’
2.0 直接使用"",若是带参数使用‘:’
调试
Swift print
没有时间
效率比NSLog更高
跟踪函数
OC __FUNCTION__
Swift #function
//2.0语言print(__FUNCTION__)
//3.0语言 print(#function)
二、常量与变量
1》 关于常量let和变量var的选择:
不可变的会更加安全,开发时,一般使用let,再须要改变的时候,再改为var
2》若是一个变量从未被改变,会提出警告
//Variable 'x' was never mutated; consider changing to 'let' constant
//变量x历来没有被修改,建议使用let
3》修改视图属性,依然使用常量
let v = UIView()
//仅仅修改v的属性,并无修改v的指针地址
v.backgroundColor = UIColor.redColor()
4》若是须要指定变量和常量的类型,能够使用 let x:类型 = 值
提示:在Swift开发中,极少使用直接指定类型,一般都是自动推导
5》定义变量var,定义后能够修改;常量let,定义以后不可修改
自动推导变量和常量的类型会根据右侧的代码的执行结果,推导对应的类型
热键:option + click 查看类型
整数:Int 与OC中的NSInteger相似
小数:Double 与OC中的CGFloat相似
6》在Swift中对类型要求异常严格
任何不一样类型的数据之间,不容许直接运算,不会作默认隐式转化,全部的数据类型肯定都要由程序员负责
7》Swift不在基本数据类型,都是结构体
三、可选项Optional
(1)原始的可选项定义(None 没有值 或者 Some某一类值)
let x:Optional = 10
(2)简单的定义
'?'用来定义 y是一个可选项的整数类型
let y:Int? = 20
若是不进行初始化会直接报错:
Constant 'y' captured by a closure before being initialized
//常量y使用以前必须初始化
不一样类型之间的值不能够直接运算,若是没有值则默认nil,不是任何数据类型,不参与计算,print(x+y)提示错误;
解决:'!'强行解包,在可选值中选择非空值,若是值初始化为nil,会崩溃
定义y,没有初始化
let y:Int?
给常量设置数值,初始化的工做能作一次
y = 20
//两次修改常量会报错
//y = 3
var 的可选项默认为nil
//let 的可选项没有默认值
var x:Int?
//输出nil
x = 10
x = 100
//输出可选项100
print(x)
四、逻辑分支
1>简单的分支
a.条件不须要()
b.语句必须有{}
if x < 6 {
}else {
}
2>三目(三目语法跟OC同样)
x > 5 ? print() : print()
有时候使用'()'表示空执行
x > 5 ? print() : ()
3>switch
/*
1.switch 能够针对任意类型的值进行分支,不在局限整数
2.switch 通常不须要break
3.switch 若是多时,使用','
4.全部的分支至少须要一条指令,若是什么都不干,才使用break
*/
func demo(num: String){
//let num = 10
switch num {
case "10","9":
print("优")
case "8":
break
default:
print("通常")
}
特殊的使用,不常常出现
let point = CGPoint(x: 10, y: 10)
switch point {
case let p where p.x == 0 && p.y == 0:
print("原点")
default:
print("")
}
五、可选的判断
一、if let 和 guard let 的技巧:
使用同名的变量接收者,在后续使用的都是非空值,不须要解包;
好处:能够避免命名的烦恼
guard 守卫/守护
guard let 和 if let 恰好相反
if let name = name,age = age {
//非空的name和age仅在{}有效
print(name + String(age))
print("------------")
}else{
print("姓名或者年龄为 nil")
}
//guard let 守护必定有值,若是没有直接返回
guard let name = name,age = age else{
print("姓名或者年龄为 nil")
return
}
//代码执行至此,name和age必定有值
//一般判断是否有值以后,会作具体的逻辑实现,一般代码多
//若是用if let 凭空多了一层分支,guard是下降分支层次的办法
//guard 是Swift 2.0以后推出的
print(name + String(age))
二、if let/var 连用语法,目的就是判断值
//不是单纯的if
if oName != nil && oAge != nil {
print(oName! + String(oAge!))
}
//if let 连用,判断对象的值是否为nil,{}内必定有值,能够直接使用,不须要解包
//if var 连用,{}内能够对值进行修改
if var name = oName,let age = oAge {
name = "老李"
//进入分支以后,name 和 age 必定有值,不须要解包
//name age 做用域仅在{}中
print(name + String(age))
}else{
print("name 或者 age 为nil")
}
三、??
??是一个简单的三目
若是有值,使用值
没有值,使用 ?? 后边的值代替
//?? 操做符的优先级低 ,在使用的时候最好加上()
print((x ?? 0) + (y ?? 0))