5.6 练习及解析

(1)编写一个计算阶乘的函数。

解析:

        func funcOne(param:Int) -> Int {
            guard param>0 else{
              return 0
            }
            var tmp = param
            var result = 1
            while tmp>0 {
              result *= tmp
              tmp -= 1
            }
            return result
        }
        funcOne(param: 5)

(2)编写函数,其功能是:判断输入的字符是否为数字字符。如果是,则输出true,否则输出false。

解析:

        func funcTwo(param:Character) -> Bool {
            if param <= "9" && param >= "0" {
              return true
            }else{
              return false
            }
        }
        funcTwo(param: "9")

(3)编写函数,其功能是:将两个两位数的正整数a、b合并成一个整数c,合并规则是将a的十位和个位分别放在c的千位和个位,将b的十位和个位分别放在c的百位和十位。

解析:

        func funcThree(param1:Int, param2:Int) -> Int {
            //param1的个位数字
            let tmpa1 = param1%10
            //param1的十位数字
            let tmpa2 = param1/10%10
            //param2的个位数字
            let tmpb1 = param2%10
            //param2的十位数字
            let tmpb2 = param2/10%10
            return tmpa2*1000+tmpb2*100+tmpb1*10+tmpa1
        }
        funcThree(param1: 45, param2: 12)

(4)编写函数,将字符串中的大写字母变成对应的小写字母,将小写字母变成对应的大写字母,其他字符不变。

解析:

        func funcFour(param:String) -> String {
            var str = ""
            for char in param.characters {
              if char >= "a" && char <= "z" {
                  //swift3.0
                  str.append(String(char).uppercased())
              }else if char >= "A" && char <= "Z" {
                    str.append(String(char).lowercased())
              }else{
                  str.append(char)
              }
            }
            return str
        }
        funcFour(param: "How Are You? ")

(5)编写函数,输入一个大于0的数字,将不大于这个数字的所有正奇数的和与正偶数的和以元组的形式返回。

解析:

    func funcFive(param:Int) -> (Int, Int) {
        guard param>0 else {
          return (0,0)
        }
        //奇数和
        var sum1 = 0
        //偶数和
        var sum2 = 0
        var tmp = param
        while tmp>0 {
          if tmp%2==0 {
              sum2+=tmp
          }else{
              sum1+=tmp
          }
          tmp-=1
        }
        return (sum1, sum2)
    }
    funcFive(param: 10)

(6)编写函数,输入不定个数的一组整数值,统计其中正数和负数的个数,0不纳入统计。

解析:

    func funcSix(param:Int...) -> (Int, Int) {
        //正数个数
        var sum1 = 0
        //负数个数
        var sum2 = 0
        for index in param {
          if index>0 {
              sum1 += 1
          }else if index<0 {
              sum2 += 1
          }
        }
        return (sum1, sum2)
    }
    funcSix(param: 1,2, -1, -4,2,3,5,0, -12)

(7)编写函数,输入圆的半径,返回圆的周长和面积。

    func funcSeven(param:Double) -> (Double, Double) {
        //周长
        let l = M_PI * 2 * param
        //面积
        let  s = M_PI * param * param
        return (l, s)
    }
    funcSeven(param: 3)

(8)编写函数,输入不定个数的整数,将其中的最大值和最小值返回。

        func funcEight(param:Int...) -> (Int, Int) {
            return (param.maxElement()! , param.minElement()! )
        }
        funcEight(param: 1,2, -5,5,13,64, -8)

(9)使用闭包的风格模拟Dictionary数据的遍历。

解析:

        //创建一个字典示例
        let dic:Dictionary = [1:"1",2:"2",3:"3",4:"4",5:"5"]
        //创建一个函数 通过闭包来传递遍历结果
        func MyEnumDic(dic:Dictionary<Int, String>, closure:(_ key:Int, _ value:String)
    ->Bool){
        //遍历字典
            for item in dic {
              //执行闭包代码
              if closure(key: item.0, value: item.1) {
                  //如果闭包返回值为true则中断遍历
                  return
              }
            }
        }
        MyEnumDic(dic: dic) { (key, value) -> Bool in
            if key == 3 {
              //开发者自己控制中断遍历的逻辑
              print(value)
              return true
            }
            print(value)
            return false
        }

本题中的代码设计十分巧妙,MyEnumDic(dic:, closure:)函数将每次遍历字典的结果传递给闭包,具体这些结果应怎样使用,完全交由闭包中的逻辑来做,并且通过闭包的返回值控制字典遍历是否结束,当开发者找到自己需要的值后,在闭包中返回true即可提前中断字典的遍历,提高代码的运行性能。