iOS经典讲解之Swift函数详解(一)

Swift函数详解
本文详细介绍了Swift语言中的函数定义与使用,包括无参无返回值、有参带返回值、不定参数个数、参数类型默认值等多种函数形式。此外,还探讨了函数作为返回值的应用场景及函数类型的别名。

作者:Loving_iOS

转载请标明出处:http://blog.youkuaiyun.com/loving_ios/article/details/49365233

本次讲解的开发环境为Xcode7.0.1 创建playground文件,进行的代码编写。

//***********************函数*************************
/*
 函数 语法格式: func 函数名(参数列表)—>返回值类型{

               函数实现...
}
*/

// 无参 无返回值
func func1() {
    print("hello")
}

func func2() -> Void {
    print("hello")
} // 和上面等价

// 函数调用
func1()
func2()

// 有参
// 1.关于内部参数名 只在函数作用域内部使用
func func3(name:String, age:Int) {
    
    print("name= \(name) age = \(age)")
}
// func3(<#T##name: String##String#>, age: <#T##Int#>)  除了第一个参数 其他参数 在调用时会自动生成 与参数名相同的外部参数名
// 原则上在定义函数时第一个参数的外部变量名应该写在函数名后面 如:
//func func3Name(name:String, age:Int)

func3("Bob", age: 18)
// 除了上面的方式外 函数参数的外部参数名可以自己添加 添加规则: 在内部参数名前面添加 用空格隔开

func func4(mingzi name:String, nianling age:Int) {
    print("name= \(name) age = \(age)")

}
func4(mingzi: "Tom", nianling: 20)

// 使用占位符 _省略掉外部参数名
func func5(name:String, _ age:Int) {
    print("name= \(name) age = \(age)")

}

func5("john", 20)

// 可以给函数的参数赋初值
func func6(name:String = "jack", age:Int = 12) {
    print("name= \(name) age = \(age)")

}

// 在调用时注意
//1.不传参数则使用初值
// func6()
// 2.传一个参数则替换掉第一个参数的初值
//func6("mary")
// 3.可以指定修改那个参数
func6(age: 20)

// 有返回值的时候
func func7() -> String {
    return "你好"
}
func7()

// 不确定参数个数
func func8(numbers:Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
    
}

func8(2, 4, 5)

// 参数在函数体内默认是不变的 用var修饰后可变
func func9(var num1:Int, num2:Int) -> Int {
    
    num1 += num2
    return num1
}

func9(1, num2: 3)

// inout修饰参数 将外部变量的地址传过来 从而改变外部变量的值
func func10(inout num:Int) {
    num++
}
var number2 = 10
func10(&number2)
number2

// 练习:给一个字符串返回元音和辅音的个数
func count(tempString:String) -> (Int, Int) {
    
    var num1 = 0
    var num2 = 0
    for charStr in tempString.characters {
        
        switch charStr
        {
            case "a", "e", "i", "o", "u":
            num1++
        default:
            num2++
            
        }
    }
    
    return (num1, num2)
}

count("hfejflekf")



// 函数嵌套:函数作用域内定义了另外一个函数 内层函数的作用域内可以使用外层函数的参数
func function(var number:Int) {
    number++
    func function1() {
        
        number++
    }
    
    function1()
    number
    
    
}
function(3)


// 返回类型为函数类型

func function2() -> ((Int)->String) {
    
    
    func hanshu(num:Int) -> String {
        
        return "num = \(num)"
    }
    
    return hanshu // 只写返回的函数名
}

let hanshu = function2()
hanshu(2)

//练习: 声明一个函数 实现功能:传入“+”“-”“*”“/”字符串返回对应运算函数:如传入"+" 返回 int + int = int

// 方法一:

func operators(str:String) -> ((Int, Int) -> Int)? {
    
    func add(num1:Int, num2:Int) ->Int {
        
        return num1 + num2
    }
    
    func minus(num1:Int, num2:Int) ->Int {
        
        return num1 - num2
    }
    
    func mult(num1:Int, num2:Int) ->Int {
        
        return num1 * num2
    }
    
    func div(num1:Int, num2:Int) ->Int {
        return num1 / num2
    }
    
    switch str
    {
        
        case "+":
        return add
        case "-":
        return minus
        case "*":
        return mult
        case "/":
        return div
    default:
        return nil
    }
  
}

let addFunction = operators("+")
addFunction!(2, 3) // 使用可选类型 使用时要解包
let minusFunction = operators("-")
minusFunction!(3, 2)
let multFunction = operators("*")
multFunction!(2, 3)
let divFuncton = operators("/")
divFuncton!(3, 2)

// 方法二:
func operations(str:String) -> ((Int, Int) ->Int)? {
    
    func operation(num1:Int, num2:Int) -> Int {
        
        
        switch str
        {
            
            case "+":
            return num1 + num2
            case "-":
            return num1 - num2
            case "*":
            return num1 * num2
            case "/":
            return num1 / num2
        default:
            return 0
            
        }
       
    }
    
    return operation
    
}

// 方法一和方法二的运算结果没有区别 注意:函数返回值为函数时可以用函数嵌套实现,但不是必须使用函数嵌套。方法一可以将内层函数放在外面一样可以,因为内层的函数没有使用外层函数的参数,而方法二必须嵌套,因为内层函数用了外层函数的参数

// 可以给函数类型起别名

typealias funcType = (Int, Int) ->Int

func function3() -> funcType {
    
    
    func function(num1:Int, num2:Int) ->Int {
        
        return num1 + num2
        
    }
    
    return function
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值