Swift具体解释之三----------函数(你想知道的都在这里)
函数(你想知道的都在这里)
注:本文为作者自己总结。过于基础的就不再赘述 ,都是亲自測试的结果。如有错误或者遗漏的地方。欢迎指正。一起学习。
1、 函数的简单定义和调用
简单的无參函数就不再赘述 , name为形參 。也是内部在数名 。
func sayHello(name:String) ->String
{
return name+" say: hello"
}
调用的时候也非常easy sayHello("zhangsan")
是不是非常easy呀!
2、外部參数名
什么是外部參数名呢。事实上就是你给形參起得一个有意义的别名,让别人更理解这个參数的用途 。
func sayHello1(YourNmae name:String,name2:String) ->String
{
return name+" say: hello "+name2
}
这里调用的时候要加上这个别名sayHello1(YourNmae: "zhangsan",name2:"lisi")
swift 默认从第二个參数開始自己主动加外部參数名。等于内部參数名 。
假设你不想输入外部參数名能够在前面加个下划线
//忽略外部參数名
func add(a:Int , _ b:Int) ->Int
{
return a + b
}
add(1, 1) //2
3、參数默认值
函数传入參数的时候能够给一个默认值,传參数的时候这个有默认值的可传可不传
func plus(a:Int,another b:Int=0) -> Int
{
return a+b;
}
这里给b的默认值是0,在调用的时候 print(plus(1)) 得到结果是1 。 plus(1,another:2) 得到结果是3
4、可变參数
可变參数(variadic parameter)能够接受一个或多个值。函数调用时。你能够用可变參数来传入不确定数量的输入參数。通过在变量类型名后面增加(…)的方式来定义可变參数。
传入可变參数的值在函数体内当做这个类型的一个数组
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
这里numbers被当成了一个数组 arithmeticMean(1,2,3,4,5.5) 得到结果 3.1
也能够传String 或者不论什么其它类型
func say(name:String, content:String ... )
{
var str = name;
for item in content
{
str += item + " "
}
print(str)
}
调用say("lily ", content:"like" ,"eat" ,"apple") 结果:lily like eat apple
5、常量參数和变量參数
函数參数默认是常量。试图在函数体中更改參数值将会导致编译错误
我这里尝试去改动name的值,这里提示我不能改动let value
可是,有时候,假设函数中有传入參数的变量值副本将是非常实用的。你能够通过指定一个或多个參数为变量參数,从而避免自己在函数中定义新的变量。变量參数不是常量,你能够在函数中把它当做新的可改动副本来使用。
这时候我们须要。通过在參数名前加关键字 var 来定义变量參数:
func say1(var name:String)->String
{
name += "2"
return name;
}
调用函数say1("wangwu") 得到结果:wangwu2
6、函数类型(Function Types)
什么是函数类型呢? 事实上每一个函数都有种特定的函数类型。由函数的參数类型和返回类型组成。比方上面的say1的函数类型就是(String)->String ,无參数和返回值的 ()->() 返回Void类型的函数
看下swift中Void事实上是一个空得元组
以下看下怎么使用函数类型 。
函数类型变量
var mySay:(String)->String = say1跟定义普通的变量一样 ,把函数类型当普通类型使用就可以,这里
say1就是我们前面写的那个函数
当然我们也能够利用swift的仅仅能判断,不指定类型var mySay = say1
调用的时候跟调用普通函数一样mySay("hello")结果:hello2函数类型作为參数类型
func sayWord(mySay:(String)->String , name:String)->String
{
return mySay(name)
}这里我们定义了一个函数,须要传入两个參数。第一个參数是一个函数类型的 (String)->String, 最后返回一个String .
调用的时候我们能够在这里给它传一个定义好得函数sayWord(say1,name: "my")。 结果:my2
我们也能够使用闭包sayWord({ "\($0)2" },name: "my")结果:my2
在这里有些人可能还不太了解闭包,先不用管下一节会具体介绍 。函数类型作为返回类型
有时候我们须要在不同的情况下使用不同的函数 ,比方我们须要传入一个数字。这个数字大于0使用Forward ,小于 0 使用 Backward , 当然这里仅仅是简单的逻辑,能够用if - else搞定 ,可是逻辑十分复杂的时候能够分两个函数来写
来看下样例 :
func stepForward(input: Int) -> Int {
return input + 1
}
func stepBackward(input: Int) -> Int {
return input - 1
}
func chooseFunc(distance:Int) -> (Int)->Int
{
return distance>10 ? stepBackward:stepForward
}
这里定义两个非常easy的函数 ,还是在定义了一个依据传入參数而选定函数的函数
var input = 10;
for i in 8...14
{
input = chooseFunc(i)(input)
print(input)
}
我们在这里 分别给函数传入8 –14 ,得到的函数在传入10 。看下这个数字的改变 。结果是 :
11 12 13 12 11 10 9这个应该非常easy理解
7、返回元组
我们的函数也能够返回一个元组类型
func minMax( arr:Int ... )->(max:Int,min:Int)
{
var max = 0
var min = 0
for item in arr
{
if(item<max)
{
max = item
}
if(item>min)
{
min = item
}
}
return (max,min)
}
这是一个非常easy的函数 ,传入一个可变參数 ,然后求出这写里面的最大和最小值 。
调用 :minMax(2,3,5,88,98,-3) 结果 :(.0 -3, .1 98)
可选元组 - 有时候我们函数里面返回的是一个nil 。所以这是我们就须要把我们的元组写成可选元组。
注意:(Int,Int)?
与 (Int?
,Int?) 不同, (Int,Int)? 表示整个元组是可选的 而不是每一个元素是可选的
func mm()->(max:Int,min:Int)?
{
return nil
}
if let c = mm()
{
print("aa")
}else
{
print("bb")
}
这段代码最后输出的是 bb
8、输入输出參数 inout
将函数的參数声明成inout 这个值能够在函数中改动 , 然后被传出函数 替换原来的值 ,所以不能仅仅传入 字面量 要传入地址 加 &
var myDate = 9
func normalFunc(var data:Int)
{
data = 100
}
normalFunc(myDate)
print(myDate) //9
func inoutFunc(inout data:Int)
{
data = 100
}
inoutFunc(&myDate)
print(myDate) //100
能够看到,普通函数不会改变实參的值。而inout回改变 。传得时候一定要加上 & ,事实上不加也会爆错得。。
9、嵌套函数
你能够把函数定义在别的函数中 叫做嵌套函数 嵌套函数对外界是不可见的
还是我们刚才那几个函数 ,还能够这么玩。
func MychooseFunc(distance:Int) -> (Int)->Int
{
func stepBackward(input: Int) -> Int {
return input - 1
}
func stepForward(input: Int) -> Int {
return input + 1
}
return distance>10 ? stepBackward:stepForward
}
临时先这么多吧, 以后想到什么再来补充 ,大家能够收藏了当字典,忘记了来查查使用方法。
学习iOS,有他就够了。小码哥视频。传智、黑马、各种swift书籍
Swift具体解释之三----------函数(你想知道的都在这里)的更多相关文章
- swift学习笔记2——函数、闭包
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 【Swift学习】Swift编程之旅---函数(十)
函数是一组用于执行特定任务的独立的代码段,你用一个名字来标识函数,这个名字是用来“调用”函数来执行它的任务. swift统一函数的语法具有足够的灵活性来表达任何一个简单的不带参数的名称与本地和外部的每 ...
- Swift 1.1语言函数参数的特殊情况本地参数名外部参数名
Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4 函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部 ...
- The Swift Programming Language-官方教程精译Swift(7)函数 -- Functions
函数 函数是执行特定任务的代码自包含块.通过给定一个函数名称标识它是什么,并在需要的时候使用该名称来调用函数以执行任务. Swift的统一的功能语法足够灵活的,可表达任何东西,无论是不带参数名称的简单 ...
- Swift具体解释之六----------------枚举、结构体、类
枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...
- Swift中文教程(四)--函数与闭包
原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...
- swift具体解释之八---------------下标脚本
swift具体解释之八-----下标脚本 下标脚本 能够定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中.能够觉得是訪问对象.集合或序列的快捷方式.不须要 ...
- 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...
完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
随机推荐
- vuex 闲置状态重置方案
前言 大型单页应用(后面都是指spa),我们往往会通过使用状态管理器 vuex 去解决组件间状态共享与状态传递等问题.这种应用少则几十个单页,多则上百个单页.随着路由的频繁切换,每个路由对应的 vue ...
- 作诗(si)[分块]
题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅读 ...
- PatentTips - Virtualizing performance counters
BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...
- 华为:一张图看懂 HBase
来自为知笔记(Wiz)
- Spark修炼之道(高级篇)——Spark源代码阅读:第十二节 Spark SQL 处理流程分析
作者:周志湖 以下的代码演示了通过Case Class进行表Schema定义的样例: // sc is an existing SparkContext. val sqlContext = new o ...
- LVDS原理及设计指南
LVDS是一种低摆幅的差分信号技术,它使得信号能在差分PCB 线对或平衡电缆上以 几百Mbps的速率传输,其低压幅和低电流驱动输出实现了低噪声和低功耗. IEEE 在两个标准中对LVDS ...
- 算法导论————EXKMP
[例题传送门:caioj1461] [EXKMP]最长共同前缀长度 [题意]给出模板串A和子串B,长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](1<=i<=lenA), ...
- php中对象转数组有哪些方法(总结测试)
php中对象转数组有哪些方法(总结测试) 一.总结 一句话总结:json_decode(json_encode($array),true)和array强制转换(或带递归) 1.array方式强制转换对 ...
- RPC和Socket
RPC和Socket的区别 rpc是通过什么实现啊?socket! RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的 ...
- css历史
CSS目前最新版本为CSS3,是能够真正做到网页表现与内容分离的一种样式设计语言.相对于传统HTML的表现而言,CSS能够对网页中的对象的位置排版进行像素级的精确控制,支持几乎所有的字体字号样式,拥有 ...