Swift 函数

1、函数的定义

复制代码
func test() ->Void{
    print("test")
}

func test() {
    print("test")
}
func test() ->(){
    print("test")
}
func pi() -> Double {
    return 3.14
}

复制代码

2、隐式返回

func sum (v1 :Int , v2: Int) -> Int{
    return v1+v2;
}
//形参默认是let 也只能是let
func sum (v1 :Int , v2: Int) -> Int{
     v1+v2;
}

3、元组返回、实现多返回值

func calcute(v1 :Int , v2: Int) ->(sum:Int,cha:Int,avg:Double){
    return (v1+v2,v1-v2,Double((v1+v2))/2.0)
}

print(calcute(v1: 2, v2: 3))
print(calcute(v1: 2, v2: 3).sum)
print(calcute(v1: 2, v2: 3).cha)
print(calcute(v1: 2, v2: 3).avg)

4、参数标签

复制代码
func gotoWork( time:Int) ->(){
    print("gotoWork:\(time)点")
}
//参数标签
func gotoWork(at time:Int) ->(){
    print("gotoWork:\(time)点")
}

gotoWork(at: 8)
//使用下划线省略参数标签
func sum (_ v1 :Int ,_ v2: Int) -> Int{
    return v1+v2;
}

print(sum(3, 3))
复制代码

5、默认参数值

复制代码
func person (name : String="nobody" , age: Int = 50 ,weight:Double) {
    print("name:\(name)  age\(age)  weight:\(weight)")
}
person(name: "jack", age: 18, weight: 99.5)
person(weight: 33)
person(name: "tom", weight: 12)
// 输出
//name:jack  age18  weight:99.5
//name:nobody  age50  weight:33.0
//name:tom  age50  weight:12.0
复制代码

6、可变参数

复制代码
func sum (numbers : Int...)->(Int){
    var s = 0
    
    for i in numbers {
        s+=i
    }
    return s
}

print(sum(numbers: 1,2,3,4))  //10
// 注意 一个函数只有有一个可变参数 并且紧跟着的第一个 参数标签不能省略
func test (numbers: Int... , name:String ,_ age :Int){
    print("number:\(numbers) name:\(name) age:\(age)")
}
test(numbers: 1,3,5, name: "jack", 20)
//输出 number:[1, 3, 5] name:jack age:20
复制代码

7、Swift 自带的 print 函数

复制代码
/// - Parameters:
///   - items: Zero or more items to print.
///   - separator: A string to print between each item. The default is a single
///     space (`" "`).
///   - terminator: The string to print after all items have been printed. The
///     default is a newline (`"\n"`).
//public func print(_ items: Any..., separator: String = " ", terminator: String = "\n")
// separator 元素分割符  terminator 结尾符号
print(1,2,3,4, separator: "--", terminator: "..")
print(8,9,10, separator: "--", terminator: "..")
//输出 1--2--3--4..8--9--10..
复制代码

8、 inout

可以用inout定义一个输入输出参数:可以在函数内部修改外部实参的值

可变参数不能标记为inout

 inout参数不能有默认值

inout参数的本质是地址传递(引用传递)

inout参数只能传入可以被多次赋值的

复制代码
func swapValue(v1 : inout Int,v2 : inout Int){
    let t = v1;
    v1=v2;
    v2=t;
}

var a = 10
var b = 20

swapValue(v1: &a, v2: &b)
print("a\(a)==b\(b)")

swap(&a, &b)
print("a\(a)==b\(b)")
复制代码

9、函数重载

复制代码
//规则  函数名相同  参数类型不同、参数标签不同
func sum (a:Int,b:Int){

}

func sum (a:Float,b:Int){
    
}

func sum (a:Int,b:Float){
    
}
func sum (a:Int,b:Int,c:Int){
    
}
复制代码

 

复制代码
//函数重载于返回值无关
//默认参数与函数重载参数冲突时
func sum (a:Int,b:Int,d:Int=20){
    
}

sum(a: 2, b: 2) //调用 func sum (a:Int,b:Int){}

//可变参数 省略参数标签、与函数重载产生二义性时 、编译器会报错 Ambiguous use of 'sum‘
func sum (_ a:Int,_ b:Int){
    
}
func sum (_ numbers:Int...){
    
}

sum(1,2)
复制代码

10、函数类型

复制代码
func sum(v1:Int,v2:Int) -> Int {
    v1+v2
}
//定义变量
var fun:(Int,Int)->Int = sum
//调用时不需要带参数标签
print(fun(1,33))

//函数类型作为函数参数
func sum(v1:Int,v2:Int) -> Int {
   return v1+v2
}

func difference(_ v1:Int,_ v2:Int)->Int{
 return  v1-v2
}

func calcute (_ result:(Int,Int)->Int ,v1:Int ,v2:Int){
        print(result(v1,v2))
}

calcute(sum(v1:v2:), v1: 1, v2: 9) //10
calcute(difference(_:_:), v1: 9, v2: 3) //6
复制代码
复制代码
//函数类型昨晚函数返回值
func prefious(_ input:Int)->Int{
    input-1
}
func next(_ input:Int)->Int{
    input+1
}

func foward(isNext:Bool)->(Int)->Int{
    isNext ? next : prefious
}

print( foward(isNext: false)(9)) //8
复制代码

11、 typealias用来给类型 起别名

复制代码
typealias date = (year:Int,month:Int,day:Int)
func test(d:date){
    print(d.year)
    print(d.1)
    print(d.day)
}
test(d: (1,2,3))

typealias Byte = Int8

typealias Intfn = (Int,Int)->Int

func diff(v1:Int,v2:Int) -> Int {
    v1-v2
}

let fn:Intfn=diff

print(fn(30,2)) //28
//按照swift的标准定义void就是空元组  public typealias Void = ()
复制代码

12、嵌套函数 将函数定义在函数内部

复制代码
func foward(isNext:Bool)->(Int)->Int{
    func prefious(_ input:Int)->Int{
        input-1
    }
    func next(_ input:Int)->Int{
        input+1
    }
  return  isNext ? next : prefious
}

print(foward(isNext: true)(11)) //12
print(foward(isNext: false)(8)) //7
复制代码

 

posted @   ZhangShengjie  阅读(364)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示