Swift基础(四):闭包、枚举

来源:互联网 发布:sql 逻辑运算符 编辑:程序博客网 时间:2024/06/06 02:04

目录:

1.闭包

闭包语法规则,闭包简化,尾随闭包,捕获值,闭包是引用类型,非逃逸闭包,自动闭包

2.枚举

switch穷举枚举,枚举关联值,枚举的原始值,递归枚举



//1.闭包

/* 闭包的语法规则

{ (parameters) -> returnType in

    statements

}

*/

var varArray = ["aaaa","gggg","bbbb","uuuu"];

let varRet =varArray.sort({(para1:String,para2:String) ->Bool inreturn para1 > para2});

varRet;//排序完成的结果:["uuuu", "gggg", "bbbb", "aaaa"]

//闭包简化

let varRet2 =varArray.sort({s1,s2 ->Boolinreturn s1 > s2});

let varRet3 =varArray.sort({s1,s2 ->Boolin  s1 > s2});

let varRet4 =varArray.sort({$0 > $1});

let varRet5 =varArray.sort(>);


//尾随闭包

/*

如果您需要将一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾

随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用.

*/

//将上面排序的闭包改为尾随闭包:

let varRet6 =varArray.sort() { $0 > $1 }

//如果函数只需要闭包表达式一个参数,当您使用尾随闭包时,您甚至可以把 ()省略掉:

let varRet7 =varArray.sort { $0 > $1 }


//捕获值

func makeIncrementor(forIncrement amount:Int) -> () ->Int//返回值是一个函数类型

{

    var runningTotal =0

    func incrementor() ->Int

    {

        runningTotal += amount

        return runningTotal//runningTotal值被外部函数引用,保证被调用完成后不会消失

    }

    returnincrementor

}

let makeIncrementorByEight =makeIncrementor(forIncrement:8);

makeIncrementorByEight();//返回8

makeIncrementorByEight();//返回16


//闭包是引用类型

//非逃逸闭包

//自动闭包


//2.枚举

enum Direction {case West, East, South, North};

// North , South , East West不会被隐式地赋值为 0 , 1 , 2 3。相反,这些枚举成员本身就是完备的值.

let letValEnum =Direction.North;

switch(letValEnum)//swith穷举枚举

{

case .South:

    print("Direction:South");

    break;

case .North:

    print("Direction:North");

    break;

case .East:

    print("Direction:East");

    break;

case .West:

    print("Direction:West");

    break;

default:

    break;

}

//枚举关联值

enum Barcode {

    case UPCA(Int, Int, Int, Int)

    case QRCode(String)

}

/*

以上代码可以这么理解:

定义一个名为 Barcode的枚举类型,它的一个成员值是具有 (Int,Int,Int,Int)类型关联值的 UPCA ,另一个成员值是具有 String类型关联值的 QRCode

*/

var productBarcode =Barcode.UPCA(8,85909,51226,3);

productBarcode = .QRCode("ABCDEFGHIJKLMNOP");

switchproductBarcode

{

case .UPCA(let numberSystem,let manufacturer,let product,let check):

    print("UPC-A:\(numberSystem),\(manufacturer),\(product),\(check).");

    break;

case .QRCode(let productCode):

    print("QR code:\(productCode).");

    break;

}

// 输出 "QR code: ABCDEFGHIJKLMNOP."


//枚举,原始值

enum ASCIIControlCharacter:Character

{

    case Tab ="\t"

    case LineFeed ="\n"

    case CarriageReturn ="\r"

}

/*

枚举类型 ASCIIControlCharacter的原始值类型被定义为 Character ,并设置了一些比较常见的 ASCII控制字符。

*/

//原始值的隐式赋值

enum Planet:Int

{

    case Mercury =1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune

}

print(Planet.Venus.rawValue);//Venus隐式赋值为2.rawValue可输出原始值

enum CompassPoint:String

{

    case North, South, East, West

}

print(CompassPoint.South.rawValue);//South隐式赋值为“South”.rawValue可输出原始值

//通过原始值来访问初始化枚举项

let positionToFind =5

iflet somePlanet =Planet(rawValue:positionToFind)

{

    switch somePlanet

    {

    case .Earth:

        print("Mostly harmless")

    default:

        print("Not a safe place for humans")//print

    }

}

else

{

    print("There isn't a planet at position\(positionToFind)");

}

//递归枚举

indirect enum ArithmeticExpression

{

    case Number(Int);

    case Addition(ArithmeticExpression, ArithmeticExpression);//递归ArithmeticExpression枚举

    case Multiplication(ArithmeticExpression, ArithmeticExpression);

}

func evaluate(expression: ArithmeticExpression) -> Int

{

    switch(expression)

    {

    case .Number(let value):

        return value;

    case .Addition(let left,let right):

        return evaluate(left) +evaluate(right);//递归运算

    case .Multiplication(let left,let right):

        return evaluate(left) *evaluate(right);

    }

}

// 计算 (5 + 4) * 2

let five = ArithmeticExpression.Number(5);

let four = ArithmeticExpression.Number(4);

let sum = ArithmeticExpression.Addition(five,four);

let product = ArithmeticExpression.Multiplication(sum,ArithmeticExpression.Number(2));

print(evaluate(product));//输出 "18"















0 0