在JAVA中,闭包是通过“接口+内部类”实现,而在swift中我们也可以把函数理解成闭包,函数的分类:自包含函数代码块,(全局函数)有名称函数,(闭包表达式)匿名函数 ,嵌套函数

####1.语法简介 我们先看看函数语法

func funcName(参数) ->返回值{

}
func funcName(Int) ->Int{
	print("Hello funcName");
}

再看看闭包语法

第一种
{(参数) ->返回值类型 in{
 print("代码");
}
let add:(a:Int,b:Int) ->Int = { (a: Int , b: Int ) -> Int  in
    
    return a+b;
    
}

第二种
{

}

let add={
print("没有参数返回值 不需要in ");
}

####2.闭包的回调 一般我们在使用闭包的过程中,都是在使用闭包的回调,Java也相似 通过一个内部类+回调方式来实现

let a = 10; 
//系统推断为Int类型
let b:Int=10; //一样的

2.浮点数(Float、Double)

let pi = 3.14159 //系统优先推断为Double类型
let pi2:Float=3.14159 //指定为Float类型

3.布尔类型(Bool)

let type = true //系统推断为Bool类型,用true 和false 表示

3.元组(tuples)结构体和数组的杂交

let rect = (40,150) //系统推断为tuples类型
//rect类型是(Int,Int),值是(40,150)
let china = (10,"中国")
//china类型是(Int,String),值是(10,"中国")
let (code, name) = china //意思是吧china元组分解出来code=10,name="中国";
print("name=\(name)");//name="中国"
let (_, name) = china//将忽略code 只分解name="中国"

元组的访问,可以通过索引(跟数组类似)来访问,或者跟结构体类似,通过Key来访问

let china = (10,"中国")
var  A = (frist:10,second:"中国")
china.0 和A.frist 是一样的

4.可选类型(optionals)

在Java中基本数据类型变量没有赋值默认为0 Swift语言使用var定义变量,不会自动给变量赋初始值,也就是说变量没有默认值,所以要求使用变量之前必须要对其初始化。 可选类型(optionals)?&! Optional其实是个enum,里面有None和Some两种类型。其实所谓的nil就是Optional.None, 非nil就是Optional.Some

var strValues:String?   //系统推断为optionals类型,表明值可以为nil
// strValues 被自动设置为 nil Swift和Object-c nil 不一样 Object-c nil是指向不存在对象的指针,Swift是一个确定值就是Optional.None
if strValues==nil { 
    print("无值");
} 
//输出结果:无值

类型的!和? !表示 一定有值 、?表示可能没有值

@IBOutlet weak var resultTextView: UITextView!  //UITextView 一定是有值的

隐式的可选值实例介绍

let strValue1: String? = "可选值"
let strValue2: String? = strValue1 // 编译成功!strValue1 strValue2 都可能没有值

let strValue3: String? = "可选值"
let strValue4: String = strValue3! // 编译成功!需要惊叹号来获取值


let strValue3: String = "可选值"
let strValue4: String = strValue3 //编译成功! 不需要感叹号
//以下情况编译报错

let strValue1: String? = "可选值"
let strValue2: String = strValue1 // 编译失败!strValue1可能没有值

5.错误处理(error handling) 跟Java try catch类似,下面来看看一个简单的Swift异常处理

//定义异常类型
enum MyError: ErrorType {
    case ERROR
    case ISNULL
}
func testError()throws{
        var strValues:String?
        if strValues == nil{
          throw MyError.ISNULL;
        }
}
    
do{
        try testError();//处理异常
    }catch MyError.ISNULL{
        print("空值")
}