// 闭包 。类似与OC中的block 。 反向传值 。引起代码的回调 闭包作为函数参数 condition 就相当于一个闭包
func hasClosureMathes(arr :[Int] ,value :Int ,condition:(num: Int ,value :Int)->Bool)->Bool{
for item1 in arr{
if condition(num: item1, value: value){
return true
}
}
return false
}
//in 是闭包的一个标志 参数列表和返回值类型 in 闭包所要实现的代码块 func 和 in
var v1 = hasClosureMathes([2,11,10,10,5,5,3], value: 12) { (num, value) -> Bool in
/*if*/ num > value
// {
// return true
// }else{
// return false
// }
}
print(v1)
var v2 = hasClosureMathes([2,11,10,10,5,5,3], value: 1) { (num, value) -> Bool in
if num < value{
return true
}else{
return false
}
}
print(v2)
// 定义一个数组里面 String类型的人名,判断数组里面是否有一个叫小美的人,如果有,返回"大家好,小美在这呢",如果没有 ,返回"咦,怎么找不到小美"
func hasClosure1Matches (nameArr : [String] ,cb:(name1:String,xName : String )-> Bool) ->String {
for name11 in nameArr{
if cb(name1:name11, xName: "小美"){
return "大家好,小美在这呢"
}
}
return "咦,怎么找不到小美"
}
var v3 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb: { (name1, xName) -> Bool in
if name1 == xName {
return true
}
return false
})
print(v3)
//如果闭包的代码宽里面只有一句代码的话,可以省掉if 和返回语句,只要判断就ok拉 。
var v4 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb: { (name1, xName) -> Bool in
name1 == xName })
print(v3)
//$0表示闭包传进来的第一个参数。$1 表示闭包传进来的第二个参数。
var v5 = hasClosure1Matches(["luce","SuSan","张亮","小美"], cb:{
$0 == $1
})
// 闭包在我们实际应用中都有哪些。
//数组的map 属性, 可以遍历数组,然后对其进行相应的操作
//泛型,比较抽象。他会根据你进行的操作做出判断给你返回相应的值。比如你进行+操作。他就返回 Int 的数组, 如果你进行> 判断 ,他就给你返回ture 或者是false的值
var numbers = [12,13,22,12,23]
let mapedNnumbers = numbers.map ({
number in
number > 10
})
print(mapedNnumbers)
//数组的sort方法、这个方法会自动遍历进行前后比较,如果 num1 < num2为真 就会返回这两个数,如果为假 ,就会返回这两个交换过得数,从而进行排序
//[12,13,22,12,23]
let sortedNumbers = numbers.sort({
// (num1 : Int,num2 :Int)->Bool in
// num1 < num2 //< 升序排序 > 降序
$0 < $1
})
print(sortedNumbers)
// 总结一下函数作为参数和闭包的区别。
// 本质都是一样的,引起代码的回调。 只不过是,一个直接调用函数名。闭包是直接传入代码块
//在完整的闭包写法中。加入func 关键字,他就是一个函数。
//函数去掉func 加上 in 就变成了闭包。
//闭包可以省去参数列表和返回值,用$0 $1...去代替。而函数不可以。
// 类和对象 类的关键字 是class
//类里面可以有常量,变量,和函数。(成员变量)每个变量都要赋初值
class Shape {
var numberOfSides = 0
let defultDiscription = "这是一个形状"
func simpleDiscription() ->String{
return "the shape has \(numberOfSides) sides"
}
}
//生成一个Shape类的对象
//var s = Shape()
//相当于我们OC 中的 Shape *s =[[Shape alloc ]init] 可以通过.去点到他们的实例变量和方法。
var s = Shape()
print("s的边数为 \(s.numberOfSides),s 的简单描述\(s.simpleDiscription()),s的默认描述为\(s.defultDiscription)")
//每个变量都要赋初值 , 1、 直接赋初值。 2. init方法
class NamedShape{
var numberOfSides:Int
var name :String
// 在这里self是区分是否是成员变量。
init(name:String,numberOfSides:Int){
self.name = name
self.numberOfSides = numberOfSides
}
// deinit{
// 叫做析构函数,和我们OC中的dealloc用法差不多。析构函数不能带参数的,每个类最多只有一个析构函数。作用是自动销毁不用的实例变量
// 里面写需要销毁的对象
// }
func simpleDiscription() ->String{
return "\(name) has \(numberOfSides) sides"
}
}
//声称对象时,类(初始化的参数)
var ss = NamedShape(name: "有名字的形状", numberOfSides: 12)
print(ss.name)
print(ss.simpleDiscription())
print(ss.numberOfSides)