一 可选类型
let age: Int?
//类型后面加“?”表示可选类型,即:有可能没有值,没有值得时候是nil
//可选类型不能 直接使用,要在变量后面用"!"号解析之后才能使用
//对一个没有值的可选类型变量解析 会报错。
let grow = age! + 1;
//可选绑定,或者可以叫自动解析
if let aa = age {
//当age这个可选类型变量有值的时候会执行到这里。
}
//其实等价于
if age != nil {
let aa = age!;
}
let age: Int!
//类型后面加“!”叫隐式可选类型,即:第一次赋值之后就一定会有值。
// 使用隐士可选类型变量时候后面不需要加!解析。
二 空和运算符 ??
//两个问号放一起叫做空和运算符,意思是如果左边的可选类型有值
//则取左边解析后的值,如果没值则用右边的备用值。
//如果 a是Int? 则b必须是 Int
let res = a ?? b
//其实这等同于
let res = a != nil ? a! : b;
三 区间运算符 ...
let range = 1...5
//a是个区间,可以用来遍历
for index in range {
}
for index in 1...5 {
}
四 switch
swift中的switch语句比较特别,
1.不需要用break来跳出,不会贯穿到下一个case,如果想要贯穿需要添加 fallthrough关键字。
2.可以匹配,单个值 多个值 区间 元组 和添加匹配条件
let time = 20;
var message = "";
switch time
{
case 7://匹配单个值
message = "It`s time to get up.";
case 8,12,18://匹配多个值
message = "It`s time for eating.";
case let x where x>18 && x<=24://匹配满足where条件的值
message = "Happy time.";
case 1...6://匹配区间
message = "It`s time for rest.";
default:
message = "Keeping busy."
}
print(message);
//匹配元组
let somePoint = (1,1);
switch somePoint
{
case (0,0):
print("原点")
case (_,0):
print("x轴")
case (0,1):
print("y轴")
case (-2...2,-2...2):
print("在方框内")
default:
print("在方框外")
}
五 if case
这个关键字是用来简化switch的,比如有的时候只用到switch的一个case,还要费劲巴拉的写搞个default,写一堆代码
enum Movement {
case Left
case Right
case Top
case Bottom
}
//下面三个方法效果一样
let aMovement = Movement.Left
//1
switch aMovement {
case .Left: print("left")
default: ()
}
//2
if case .Left = aMovement { print("left") }
//3
if aMovement == .Left { print("left") }
六 if case let
这个是 if case 和let的组合,也用来简化繁琐的switch匹配
enum CarBrand{
case BMW(name:String,Production:String)
case AUDI(name:String,Production:String)
case BENZ(name:String,Production:String)
}
let myCar = CarBrand.BMW(name: "宝马",Production: "德国")
//这个时候想得到myCar这个枚举中关联的值 name,怎么获取
//当然可以用switch,但是有点麻烦,
switch myCar {
case let CarBrand.BMW(name,Production):
print("This car named \(name),from\(Production)")
default: () // 不做任何处理
}
// if case let
if case let CarBrand.BMW(name, Production) = myBrand{
print("\(name),\(Production)")
}
//可以这么理解: 如果myBrand枚举变量是BMW,那么顺便声明两个常量并且让他们等于myBrand的两个关联值。
七 guard
if else 判空的一种简单易读方式
func greet(person: [String: String]) {
//判断name有值才进行下面的print否则return
guard let name = person["name"] else {
return
}
//等同于
var name = "";
if person["name"] == nil {
return;
}else {
name = person["name"] !;
}
print("Hello \(name)")
}