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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构