Swift 学习记录(4)

import Foundation


/***嵌套函数***/

func getMathFunc(type:String) -> (Int)-> Int
{
    func squre(num:Int)->Int
    {
        return num*num;
    }
    
    func cube(num:Int)->Int
    {
        return num*num*num;
    }

    switch type {
    case "squre":
        return squre;
    case "cube":
        return cube;
    default:
        return cube;
    }
    
}

var mathFunc = getMathFunc("squre");
print(mathFunc(3));



/***闭包----嵌套函数的简化表达
    1.没有函数名
    2.大括号提前到形参列表前
    3.返回值后面加in表示函数体
 
 ***/

//{(形参列表) -> 返回值类型 in
//    可执行表达式
//}

//刚才嵌套函数的简化
func getMathFunc01(type:String) -> (Int)-> Int
{
    switch type {
    case "squre":
        return {(num:Int)->Int in
                return num*num;
        };
    case "cube":
        return {(num:Int)->Int in
            return num*num*num;
        };
    default:
        return {(num:Int)->Int in
            return num*num*num;
        };
    }
    
}
var mathFunc01 = getMathFunc01("squre");
print(mathFunc01(5));

mathFunc01 = getMathFunc01("cube");
print(mathFunc01(5));



//---------根据上下文推断类型


//省略形参类型和返回值类型,swift会根据变量类型推断
var squre:(Int) -> Int = {(num) in return num*num }
print(squre(3))

//可以推断形参类型,小括号也可以省略
var squre1:(Int) -> Int = {num in return num*num }
print(squre1(3))

//如果闭包中的函数体只有一行代码,那么return就可以省略
var squre2:(Int) -> Int = {num in num*num }
print(squre2(3))

//省略形参名,用$0,$1...表示第一个,第二个参数...
var squre3:(Int) -> Int = { $0 * $0 }

print(squre3(3))





var names = ["Mike", "John", "Mary", "Tom", "Bill"]

//  从小到大排序
func sortFun(s1:String, s2:String) -> Bool
{
    return s1 < s2;
}
// inout
var sortedNames = names.sort(sortFun);
print(sortedNames)


//  第1步 改成闭包形式
var sortedNames1 = names.sort({(s1:String, s2:String) -> Bool in return s1 < s2})

//  第2步 省略参数类型
var sortedNames2 = names.sort({(s1, s2) -> Bool in return s1 < s2})

//  第3步 省略返回值类型
var sortedNames3 = names.sort({(s1, s2) in return s1 < s2})

// 第4步 省略return语句
var sortedNames4 = names.sort({(s1, s2) in s1 < s2})

//  第5步 省略形参名,用$0,$1...表示第一个,第二个参数...
var sortedNames5 = names.sort({$0 < $1})

//  第6步 运算符函数   Swift 的String类型定义了关于大于号(>)的字符串实现,其作为一个函数接受两个String类型的参数并返回Bool类型的值。而这正好与sort(_:)方法的第二个参数需要的函数类型相符合。因此,可以简单地传递一个大于号,Swift 可以自动推断出您想使用大于号的字符串函数实现:
var sortedNames6 = names.sort(<)

print(sortedNames6)




var result:Int = {

    var temp = 1
    for i in 1...$1
    {
        temp *= $0
    }
    
    return temp
    
}(4,3)


print(result)


/**
 尾随闭包  如果函数的最后一个参数值是闭包,可以将闭包写在函数体外面
 */

func  someFunction(num:Int , fn:(Int) -> ()){
    
}

someFunction(20, fn:{_ in })

someFunction(20) {_ in }



let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

let strings = numbers.map {
    (number) -> String in
    var t = number
    var output = ""
    while t > 0 {
        output = digitNames[t % 10]! + output
        t /= 10
    }
    return output
}

print(strings)

//捕获上下文中的变量或者常量
//即使这些常量和变量所在的作用域不存在时,捕获的常量与变量仍会保存最后一次使用它们的值
func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen = makeIncrementor(forIncrement: 10)

//runningTotal 仍可以正常使用
print(incrementByTen())
print(incrementByTen())
print(incrementByTen())

//10
//20
//30

let incrementBySeven = makeIncrementor(forIncrement: 7)
incrementBySeven()
// 返回的值为7

incrementByTen()
// 返回的值为40



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值