Swift_函数


点击查看源码

定义和调用函数

//定义和调用函数
func testDefiningAndCallingFunctions() {
func sayHello(_ personName: String) -> String {
let greeting = "Hello " + personName + "!"
return greeting
}
print(sayHello("XuBaoAiChiYu")) /* print Hello XuBaoAiChiYu! */
}

无参数函数

//无参数函数
func testFunctionsWithoutParameters() {
//无参数 只有一个String类型的返回值
func sayHelloWorld() -> String {
return "hello world!"
}
print(sayHelloWorld()) /* print hello world! */
}

多参数函数

//多参数函数
func testFunctionsWithMultipleParameters() {
//传入两个参数 并返回一个String类型的数据
func sayHello(_ personName: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return "Hello again \(personName)!"
} else {
return "Hello \(personName)!"
}
}
print(sayHello("XuBaoAiChiYu", alreadyGreeted: true)) /* print Hello again XuBaoAiChiYu! */
}

函数无返回值

//函数无返回值
func testFunctionsWithoutReturnValues() {
//传入一个String类型的数据 不返回任何数据
func sayGoodbye(_ personName: String) {
print("Goodbye \(personName)!")
}
sayGoodbye("XuBaoAiChiYu") /* print Goodbye XuBaoAiChiYu! */
}

函数多返回值

//函数多返回值
func testMultipleReturnValues() {
//返回一个Int类型的数据
func printAndCount(_ stringToPrint: String) -> Int {
print(stringToPrint)
return stringToPrint.characters.count
}
print(printAndCount("hello world")) //返回元组合数据
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)
} let bounds = minMax([8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)") /* print hello world
11
min is -6 and max is 109 */
}

返回类型可选

//返回类型可选
func testOptionalTupleReturnTypes() {
//返回一个元组或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)
}
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
} /* print min is -6 and max is 109 */
}

指定外部参数名

//指定外部参数名
func testSpecifyingExternalParameterNames() {
//指定外部参数名to和and
func sayHello(to person: String, and anotherPerson: String) -> String {
return "Hello \(person) and \(anotherPerson)!"
}
print(sayHello(to: "Bill", and: "Ted")) /* print Hello Bill and Ted! */
}

省略外部参数名

//省略外部参数名
func testOmittingExternalParameterNames() {
//使用 _ 省略外面参数名,
func someFunction(_ firstParameterName: Int, _ secondParameterName: Int) {
print("\(firstParameterName) and \(secondParameterName)")
}
someFunction(2, 3) /* print 2 and 3 */
}

默认参数值

//默认参数值
func testDefaultParameterValues() {
//设置默认值 当用户不传入时 使用默认值
func someFunction(_ parameterWithDefault: Int = 12) {
print("\(parameterWithDefault)")
}
someFunction(6)
someFunction() /* print 6
12 */
}

可变参数

//可变参数
func testVariadicParameters() {
//传入的参数类型已知Double 个数未知
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
print("\(arithmeticMean(1, 2, 3, 4, 5))")
print("\(arithmeticMean(3, 8.25, 18.75))") /* print 3.0
10.0 */
}

常量和变量参数

//常量和变量参数
func testConstantAndVariableParameters() {
//默认为let常量参数 也可声明var可变参数 在函数内直接修改
func alignRight(_ string: String, totalLength: Int, pad: Character) -> String {
var string = string
let amountToPad = totalLength - string.characters.count
if amountToPad < 1 {
return string
}
let padString = String(pad)
for _ in 1...amountToPad {
string = padString + string
}
return string
}
let originalString = "hello"
let paddedString = alignRight(originalString, totalLength: 10, pad: "-") print("originalString:\(originalString); paddedString:\(paddedString);") /* print originalString:hello; paddedString:-----hello; */
}

In-Out参数

//In-Out参数
func testInOutParameters() {
//使用inout声明的参数 在函数内修改参数值时 外面参数值也会变
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)") /* print someInt is now 107, and anotherInt is now 3 */
}

使用函数类型

//使用函数类型
func testUsingFunctionTypes() {
//加法
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
//乘法
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
} // 函数体赋值为参数
var mathFunction: (Int, Int) -> Int = addTwoInts
print("Result: \(mathFunction(2, 3))") // 函数体指向替换
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))") // 函数体传递
let anotherMathFunction = addTwoInts
print("\(anotherMathFunction)") /* print Result: 5
Result: 6
(Function) */
}

函数做参数类型

//函数做参数类型
func testFunctionTypesAsParameterTypes() {
//加法
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
//其中一个参数为一个函数体
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
} printMathResult(addTwoInts, 3, 5) /* print Result: 8 */
}

函数做返回类型

//函数做返回类型
func testFunctionTypesAsReturnTypes() {
//加1
func stepForward(_ input: Int) -> Int {
return input + 1
}
//减1
func stepBackward(_ input: Int) -> Int {
return input - 1
}
//使用函数体做返回类型
func chooseStepFunction(_ backwards: Bool) -> (Int) -> Int {
return backwards ? stepBackward : stepForward
} var currentValue = 3 // 此时moveNearerToZero指向stepForward函数
let moveNearerToZero = chooseStepFunction(currentValue > 0) // 调用函数体
currentValue = moveNearerToZero(currentValue)
print("\(currentValue)... ") /* print 2... */
}

嵌套函数

//嵌套函数
func testNestedFunctions() {
//函数体内部嵌套函数 并做返回类型
func chooseStepFunction(_ backwards: Bool) -> (Int) -> Int {
//嵌套函数
func stepForward(_ input: Int) -> Int {
return input + 1
}
//嵌套函数
func stepBackward(_ input: Int) -> Int {
return input - 1
}
return backwards ? stepBackward : stepForward
} var currentValue = -2 let moveNearerToZero = chooseStepFunction(currentValue > 0)
currentValue = moveNearerToZero(currentValue) print("\(currentValue)... ") /* print -1... */
}

Swift_函数的更多相关文章

  1. Swift_类型选择

    Swift_类型选择 点击查看源码 //类型选择 func test() { class MediaItem { } class Movie: MediaItem { } class Song: Me ...

  2. Swift_初始化

    #Swift_初始化 点击查看源码 初始化结构体 //初始化结构体 func testInitStruct() { //结构体 类中默认方法 struct Size { //宽 var width = ...

  3. Swift_枚举

    Swift_枚举 点击查看源码 空枚举 //空枚举 enum SomeEnumeration { // enumeration definition goes here } 枚举基本类型 //枚举基本 ...

  4. Swift_闭包

    Swift_闭包 点击查看源码 闭包优化 //闭包优化 func testClosures() { //函数做参数 排序 let names = ["XuBaoAiChiYu", ...

  5. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  6. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  7. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  8. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  9. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

随机推荐

  1. content-box跟border-box的区别

    content-box: padding和border不被包含在定义的width和height之内.对象的实际宽度等于设置的width值和border.padding之和,即 ( Element wi ...

  2. Java设计模式—观察者模式

    观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe). 其定义如下: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都 ...

  3. 个人发现的createProcess调用漏洞

    现在的杀毒软件都会杀掉c盘下的program.exe程序,所以某种意义上而言,这个漏洞算不上“漏洞”. 问题描述 眼睛护士版本:3.0.18.301存在createProcess调用漏洞. 详细说明 ...

  4. 【转】My App Crashed, Now What? – Part 1

    原文地址:http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1  By Matthijs Hollemans on Mar ...

  5. dubbo学习总结一 API

    API 一般用来暴露接口 项目分层一般是 api + entity + enums + model 就是接口加上一些实体之类的东西

  6. nginx限制IP恶意调用短信接口处理方法

    真实案例: 查看nginx日志,发现别有用心的人恶意调用API接口刷短信: /Jun/::: +] "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) ...

  7. OKEX期现对冲JS源代码分享(基于Fmz, Botvs实现)

    什么是期现对冲?此策略风险和收益如何?期现对冲是利用期货和现货之间存在的差价进行套利.因为在交割日的时候,期货会按现货价格成交,当期货和现货一旦出现差价时,就可以通过做空期货做多现货(或做多期货卖出现 ...

  8. RequireJS进阶-模块的优化及配置的详解

    概述 关于RequireJS已经有很多文章介绍过了.这个工具可以将你的JavaScript代码轻易的分割成苦干个模块(module)并且保持你的代码模块化与易维护性.这样,你将获得一些具有互相依赖关系 ...

  9. 一个SAP开发人员的2018年终总结

    我是SAP成都研究院的Jerry Wang,我喂自己袋盐. 时间过得真快,2017年发生的事情还历历在目,一转眼,2018年又马上要结束了. Jerry惊恐地发现,随着年龄的增长,时光流逝的速度仿佛有 ...

  10. 021logging模块

    ##importlogging logging.debug('debug  message')logging.info('info  message')logging.warning('warning ...