Swift 学习之函数(Func)基础

从编写面向过程语言的C语言开始就一直离不开函数,当然任何语言都有函数这个概念,函数是用来完成特定任务的独立的代码块。Swift是面相对象的语言,充满现代的编程气息,更显高级,下面看看苹果在Swift中对函数都有哪些高级应用。

函数示例

func sayHelloTo(name:String?) -> String {
    return "Hello, " + (name ?? "sunfusheng")
}

print(sayHelloTo("Swift"))
print(sayHelloTo(nil))

// 输出
Hello, Swift
Hello, sunfusheng

可以提炼如下Swift函数的语法:

func 函数名(参数列表) -> 返回值类型 {
    // do something ... 
}

函数名没什么好讲的,不过苹果在OC中比较推崇具有语意的函数名,所以每个系统的函数名字都比较长,虽然在Swift中苹果有所收敛,但很多依然过长,不过反过来讲这样我们在读代码的时候会比较自然,有种一气呵成的感觉,比如上面的函数 sayHelloTo 加入一个介词 To,代码读起来就会很自然,关于函数名尽量学习官方的命名就好。接下来我分别从参数列表和返回值记录Swift语言的函数操作。

PS:

在 sayHelloTo 这个函数中还有 "??" 两个问号操作符,这个鬼在官方文档中也有说明,我称之为可选型的聚合操作符,看一下官方文档

Nil Coalescing Operator
let c = a != nil ? a! : b

这不就是三目运算符,通过聚合操作符可以简写如下样式:
let c = a ?? b

解释一下上述这行代码,意思就是 c 的值是 a 或 b 中一个的值,但有前提条件,就是当 a 解包后值不为 nil 时,那么就将 a 解包后的值赋值给 c,如果 a 解包后值为 nil,那么就将 b 的值赋值给c,还有一个条件就是,b 的类型必须和 a 解包后的类型一致。

函数的参数

看几个简单的使用示例

// 1.无参数函数
func sayHello() -> String {
    return "Hello, sunfusheng"
}

// 2.多参数函数
func sayHelloTo(name:String, separator:String, terminator:String) -> String {
    return "Hello" + separator + name + terminator
}
print(sayHelloTo("sunfusheng", separator: ",", terminator: "!"))
// 输出
Hello,sunfusheng!

// 3.可变参数函数
func sayHelloTo(names:String?..., separator:String?) -> String {
    var persons:String = ""
    for name in names {
        persons += separator ?? ","
        persons += name ?? "SunFusheng"
    }
    return "Hello" + persons
}
print(sayHelloTo("ZhangSan", "LiSi", nil, separator: ","))
// 输出
Hello,ZhangSan,LiSi,SunFusheng

// 4.默认参数函数,使用 "=" 赋上一个默认值
func sayHelloTo(name:String = "sunfusheng") -> String {
    return "Hello, " + name
}
print(sayHelloTo())
print(sayHelloTo("sun"))
// 输出
Hello, sunfusheng
Hello, sun

如果说上面这四种情况还感觉不出 Swift 函数的牛逼,那么继续往下看!

// 5.内部参数:name
func sayHello(name:String) -> String {
    return "Hello, " + name
}
// 6.外部参数:to 和内部参数:name
func sayHello(to name:String) ->  String {
    return "Hello, " + name
}
sayHello("Swift")
sayHello(to: "Swift")

在同一个文件中函数(5)和函数(6)是可以编译通过的,从而知道函数(5)和函数(6)是两个函数;函数(5)的函数名称:sayHello(_:),而函数(6)的名称:sayHello(to:)。当然在 Swift 中函数中第一个参数的外部参数是省略的,所以我这个函数(6)这样写是违背苹果 Swift 语言的默认风格的,当然是不提倡的。不过你再想想,函数(6)加上外部参数"to"这个介词后,对于这个函数的语意是有意义的,虽有点牵强,但辩证的看问题总是好的嘛。

这段说明中引出一个屌屌的符号 "_",下面用一下这个符号,比如下面的例子:

// 功能就是两个整数相加
func add(a:Int, b:Int) -> Int {
    return a + b
}
add(1, b:1)

// 这!这么用!挺反人类的!加上外部参数呢?
func add(a:Int, and b:Int) -> Int {
    return a + b
}
add(1, and: 1)

// 7.还是反人类的用法!好!使用 "_" 去掉内部参数吧!
func add(a:Int, _ b:Int) -> Int {
    return a + b
}
add(1, 1)

最后,我们看看如何修改函数传入的参数,在Swift中如果想修改传入的参数值,使用关键字 inout(输入输出参数),需要注意的是:输入输出参数不能有默认值,而且可变参数不能用 inout 标记。

// 编译错误,因为函数的参数默认是常量,不能修改
func changeNum(num:Int) {
    num = num * 10
}

// 编译通过,但不能修改传入的参数值
func changeNum(var num:Int) {
    num = num * 10
}

// 8.使用 inout 标记修改传入的参数值
func changeNum(var num:Int) {
    num = num * 10
}
var num:Int = 1
print("Before num:", num)
// 调用函数,使用取地址符传入参数的地址
changeNum(&num)
print("After num:", num)
// 输出
Before num: 1
After num: 10

上面使用了八个小例子记录并说明函数参数的使用,再看看函数返回值的使用。

函数的返回值

// 1.没有返回值的函数
func sayHello(name:String) {
    print(name)
}

// 2.返回值是可选型类型
func say(content:String?) -> String? {
    guard content != nil else {
        return nil
    }
    return content
}
print(say(nil))
print(say("sunfusheng.com"))
// 输出
nil
Optional("sunfusheng.com")

// 3.返回值是元祖类型
func swap(a:Int, _ b:Int) -> (Int, Int) {
    return (b, a)
}
print(swap(1, 2))

// 4.返回值是元祖类型的可选型,为方便解包后有语意加入元祖分量名称
func findMaxMinNum(arr:[Int]) -> (max:Int, min:Int)? {
    guard !arr.isEmpty else {
        return nil
    }
    var maxValue = arr[0]
    var minValue = arr[0]
    for num in arr {
        maxValue = max(maxValue , num)
        minValue = min(minValue , num)
    }
    return (maxValue, minValue)
}
var mm = findMaxMinNum([10, 20, 30, 40])
if let mm = mm {
    print("Max:", mm.max)
    print("Min:", mm.min)
}
// 输出
Max: 40
Min: 10

Swift 函数的基本用法先记录到此,越学越觉得 Swift 屌屌的!下一篇聊聊 Swift 和 Java 的函数式编程。

Swift 学习笔记将持续更新,欢迎关注我的公众号,大家加油!

孙福生的微信公众号

关于我

个人邮箱:sfsheng0322@126.com
GitHub主页
简书主页
个人博客
新浪微博

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容