http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3396|回复: 5

[Swift] 【Swift基础教程】函数参数与返回值

[复制链接]
发表于 2019-1-8 16:34:36 | 显示全部楼层 |阅读模式

    导读

【Swift基础教程】目录   http://www.sufeinet.com/thread-24641-1-1.html


函数参数与返回值
函数参数与返回值在 Swift 中非常的灵活。你可以定义任何类型的函数,包括从只带一个未名参数的简单函数到复杂的带有表达性参数名和不同参数选项的复杂函数。

无参数函数
函数可以没有参数。下面这个函数就是一个无参数函数,当被调用时,它返回固定的 String 消息:

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())

// 打印 "hello, world"

尽管这个函数没有参数,但是定义中在函数名后还是需要一对圆括号。当被调用时,也需要在函数名后写一对圆括号。

多参数函数
函数可以有多种输入参数,这些参数被包含在函数的括号之中,以逗号分隔。

下面这个函数用一个人名和是否已经打过招呼作为输入,并返回对这个人的适当问候语:

func greet(person: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted {
        return greetAgain(person: person)
    } else {
        return greet(person: person)
    }
}
print(greet(person: "Tim", alreadyGreeted: true))
// 打印 "Hello again, Tim!"

你可以通过在括号内使用逗号分隔来传递一个String参数值和一个标识为alreadyGreeted的Bool值,来调用greet(person:alreadyGreeted: )函数。注意这个函数和上面greet(person: )是不同的。虽然它们都有着同样的名字greet,但是greet(person:alreadyGreeted: )函数需要两个参数,而greet(person: )只需要一个参数。

无返回值函数
函数可以没有返回值。下面是 greet(person: ) 函数的另一个版本,这个函数直接打印一个String值,而不是返回它:

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave")

// 打印 "Hello, Dave!"

因为这个函数不需要返回值,所以这个函数的定义中没有返回箭头(->)和返回类型。

注意
严格上来说,虽然没有返回值被定义,greet(person: ) 函数依然返回了值。没有定义返回类型的函数会返回一个特殊的Void值。它其实是一个空的元组(tuple),没有任何元素,可以写成()。


被调用时,一个函数的返回值可以被忽略:

func printAndCount(string: String) -> Int {
    print(string)
    return string.count
}
func printWithoutCounting(string: String) {
    let _ = printAndCount(string: string)
}
printAndCount(string: "hello, world")
// 打印 "hello, world" 并且返回值 12

printWithoutCounting(string: "hello, world")
// 打印 "hello, world" 但是没有返回任何值

第一个函数 printAndCount(string: ),输出一个字符串并返回 Int 类型的字符数。第二个函数  printWithoutCounting(string: )调用了第一个函数,但是忽略了它的返回值。当第二个函数被调用时,消息依然会由第一个函数输出,但是返回值不会被用到。

注意:
返回值可以被忽略,但定义了有返回值的函数必须返回一个值,如果在函数定义底部没有返回任何值,将导致编译时错误(compile-time error)。


多重返回值函数
你可以用元组(tuple)类型让多个值作为一个复合值从函数中返回。

下例中定义了一个名为 minMax(array: ) 的函数,作用是在一个 Int 类型的数组中找出最小值与最大值。

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}
minMax(array: ) 函数返回一个包含两个 Int 值的元组,这些值被标记为 min 和 max ,以便查询函数的返回值时可以通过名字访问它们。

在 minMax(array: ) 的函数体中,在开始的时候设置两个工作变量 currentMin 和 currentMax 的值为数组中的第一个数。然后函数会遍历数组中剩余的值并检查该值是否比 currentMin 和 currentMax 更小或更大。最后数组中的最小值与最大值作为一个包含两个 Int 值的元组返回。

因为元组的成员值已被命名,因此可以通过 . 语法来检索找到的最小值与最大值:

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// 打印 "min is -6 and max is 109"

需要注意的是,元组的成员不需要在元组从函数中返回时命名,因为它们的名字已经在函数返回类型中指定了。

可选元组返回类型
如果函数返回的元组类型有可能整个元组都“没有值”,你可以使用可选的( optional ) 元组返回类型反映整个元组可以是nil的事实。你可以通过在元组类型的右括号后放置一个问号来定义一个可选元组,例如  (Int, Int)? 或 (String, Int, Bool)?

注意 可选元组类型如 (Int, Int)? 与元组包含可选类型如 (Int?, Int?) 是不同的.可选的元组类型,整个元组是可选的,而不只是元组中的每个元素值。

前面的 minMax(array: ) 函数返回了一个包含两个 Int 值的元组。但是函数不会对传入的数组执行任何安全检查,如果 array 参数是一个空数组,如上定义的 minMax(array: ) 在试图访问 array[0] 时会触发一个运行时错误(runtime error)。

为了安全地处理这个“空数组”问题,将 minMax(array: ) 函数改写为使用可选元组返回类型,并且当数组为空时返回 nil:

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}
你可以使用可选绑定来检查 minMax(array: ) 函数返回的是一个存在的元组值还是 nil:

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}
// 打印 "min is -6 and max is 109"




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2019-1-8 16:42:27 | 显示全部楼层
强烈支持楼主ing……
发表于 2019-1-8 16:55:48 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-8 18:02:31 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-8 21:05:18 | 显示全部楼层
我只是路过打酱油的。
发表于 2019-1-9 10:56:36 | 显示全部楼层
看到这帖子真是高兴!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-20 06:43

© 2014-2021

快速回复 返回顶部 返回列表