Swift之高級運算符與枚舉

//: Playground - noun: a place where people can play


import UIKit


var str = "Hello, playground"

//位運算符

//UInt8,將十進制數以二進制的方式賦值,UInt8類型是8位無符號整型,也就是說,任何一個UInt8類型的變量都是採用8個二進制位來存儲數據的。因此下面的a變量的實際存儲數據爲0b00000111。位運算的實質就是對數據的每一個二進制位進行邏輯運算

var a:UInt8 = 0b111

a = 0b100

//~取反,&位與,|位或,^異或,<<左移,

a = ~a //00000100 ->11111011   255-4 = 251

a = 0b1001 & a //11111011 & 00001001 = 00001001 ->9

a>>1 // 00001001 >>1  = 00000100 ->4

a<<1 //00001001 <<1 = 00010010 ->18

a = a<<1 // 18

//注意,進行按位左移或右移運算的時候,有可能出現丟失數據位的情況,例如對於UInt8類型,將 00001111 向左移6位,變成了 110000000

//溢出運算符

//在Swift語言注重安全性,在編寫代碼時,如果出現了數據溢出,會直接出現運行時報錯。而溢出運算符這種設計將代碼的不確定性降低了許多。所謂溢出,就是超出數據類型的最大值或者最小值,以UInt8爲例,最大值爲255,加1就會溢出

/*

 var b:UInt8 = 255

 b=b+1

 error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

 The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.

 */

//如果需要溢出操作,就要使用溢出操作符&

var b:UInt8 = 255

b = b &+ 1 //支持溢出的加操作後,b的值爲0

b = b &- 1 //255

b = b &* 2 //乘操作

//注意:對於二進制數據進行乘2運算,實質就是對二進制數據進行左移一位的運算。例如二進制數據  11111111*2 = 1111110

//運算符的重載與自定義

//定義一個形狀枚舉

enum Shape{

    

    case circle(center:(Double,Double),radius:Double)//通過圓心和半徑創建圓形

    case rect (width:Double,height:Double,center:(Double,Double))//設置矩形的寬、高、中心點

    case trangle (point1:(Double,Double),point2:(Double,Double),point3:(Double,Double))//三角的三個角點

    

}

//這樣在創建的時候,直接提供所需的參數即可

var circle = Shape.circle(center: (20, 20), radius: 20)

var rect = Shape.rect(width: 10, height: 10, center: (40, 40))

var trangle = Shape.trangle(point1: (20, 20), point2: (50, 90), point3: (30, 50))

//在switch-case結構語句中,匹配到枚舉後,可以通過參數捕獲的方式來獲取枚舉實例的相關值

func shapeFunc(param:Shape){

    switch param {

    case let .circle(center,radius):

        print("圓形:中心點\(center),半徑\(radius)")

    case let .rect(center,width,height):

        print("矩形:中心\(center),寬度\(width),高度\(height)")

    case let .trangle(point1, point2, point3):

        print("三角的頂點:\(point1)、\(point2)、\(point3)")

    }


}

shapeFunc(param: circle)

shapeFunc(param: trangle)

shapeFunc(param: rect)


//遞歸枚舉

/*

 遞歸是一種代碼算法技巧,遞歸算法的效率十分高,但是其性能資源的耗費也十分嚴重。函數的功能是進行數據計算,遞歸函數只是使用遞歸的算法來進行數據的計算。枚舉的功能是數據的描述。因此,遞歸枚舉的作用就是使用遞歸的方式來進行數據描述。

 */

//使用枚舉模擬加減乘除四則運算

enum Expression {

//    描述單個數字

    case num(param:Int)

//    表示加法,將Expression作爲相關值參數類型,使用indirect關鍵字修飾的枚舉值表示這個枚舉是可遞歸的

    indirect case add(param1:Expression,param2:Expression)

    indirect case sub(param1:Expression,param2:Expression)

    indirect case mul(param1:Expression,param2:Expression)

    indirect case div(param1:Expression,param2:Expression)

}

//運算((5+5)*2-8)/2

var  num5 = Expression.num(param:5)

//5+5

var num55 = Expression.add(param1: num5, param2: num5)

//2

var num2 = Expression.num(param: 2)

//(5+5)*2

var numMul = Expression.mul(param1: num55, param2: num2)

//8

var num8 = Expression.num(param: 8)

// -8

var numsub8 = Expression.sub(param1: numMul, param2: num8)

// /2

var resultNum = Expression.div(param1: numsub8, param2: num2)

//這樣result就是對((5+5)*2-8)/2的描述,在開發中要將描述和運算結合,能夠編寫出優美的代碼,處理遞歸枚舉通常採用遞歸函數,這樣就可以通過描述的表達式進行計算

func ExpressionFunc(param:Expression) -> Int{

    switch param {

    case  let .num(param):

        return param

    case .add(let param1, let param2):

        return ExpressionFunc(param: param1)+ExpressionFunc(param: param2)

    case .sub(let param1, let param2):

        return ExpressionFunc(param: param1) - ExpressionFunc(param: param2)

    case .mul(let param1, let param2):

        return ExpressionFunc(param: param1) * ExpressionFunc(param: param2)

    case .div(let param1, let param2):

        return ExpressionFunc(param: param1) / ExpressionFunc(param: param2)

    }

}

print(ExpressionFunc(param: resultNum))//最後的計算結果是6

//1、模擬C語言通過自定義運算符的方式實現前綴自增、前綴自減、後綴自增、後綴自減

prefix operator ++ //聲明前綴++

postfix operator ++ //聲明後綴++

prefix operator -- //聲明前綴--

postfix operator -- //聲明後綴--

prefix func ++ (param:inout Int ) ->Int{

    param += 1

    return param

}

prefix func -- (param: inout Int)->Int{

    param -= 1

    return param

}

postfix func ++(param: inout Int)->Int{

    param += 1

    return param - 1

}

postfix func -- (param: inout Int ) -> Int{

    param -= 1

    return param + 1

}

var a2 = 5

print(a2++)

//2、Swift語言中的加法運算符不能支持對區間範圍的相加操作,重載加法運算符,使其支持區間的追加,例如(0...5)+6後的計算結果爲區間0...11

func + (param:ClosedRange<Int>,param2:Int)->ClosedRange<Int>{

    return param.lowerBound...param.upperBound+param2

}

var newRange = 0...5+6 //0...5 ->param,6->param2

print(newRange)//0...11

//3、自定義階乘運算符

postfix operator *!

postfix func *! (param:Int)->Int{

    if param <= 0 {

        return 0

    }

    var tem = param

    var result = 1

    while tem>1 {

        result *= tem

        tem -= 1

    }

    return result

}

print(5*!)





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章