Swift 1

Swift 中函数使用指南

关于Swift中的各种函数的使用的总结

前言

时间久了,好多东西我们就会慢慢忘记,在这里总结一下Swift中函数的使用原则,把大部分的函数使用技巧用代码示例来做了演示,但是如果想提高,还是要多多思考才行

1.参数名

函数默认会带参数名,如果不想显示参数名,可以使用下划线_。

func createFamily(motherName: String, fatherName: String, babyName: String)  -> String {
    return motherName + fatherName + babyName
}

createFamily(motherName: "妈妈", fatherName: "爸爸", babyName: "bao‘b")

2.多参数函数

多参数函数的使用,整个函数都是可以自定义的,实现非常灵活。(也叫可变参数)

func sum(numbers: Int...) -> Int {
    var total: Int = 0
    for number in numbers {
        total += number
    }
    return total
}

sum(numbers: 1, 2, 3, 4, 5, 6)

3.可变参数

注意,在最新的swift中,已经不允许在参数中使用var了,可以使用下边的这个值传递的方式实现

func factorial(number: Int) -> Int {
    var number = number
    var res: Int = 1
    while number > 1 {
        res = res * number
        number = number - 1
    }
    return res
}

var number: Int = 4
let b = factorial(number: number)

通过a: inout 这种方式可以在函数内修改参数的值,但是在使用中还是要加入&,目的是访问参数的指针地址

func swap(a: inout Int, b: inout Int) {
    let temp = a
    a = b
    b = temp
}

var a = 10
var c = 20
swap(&a, &c)
print("a: \(a), b: \(c)")

4.函数的高级用法

1.函数本身也是一种类型

func sayHello() -> Void { // 该函数的类型为() -> ()

}
// 该函数的类型为(Dictionary<String, String>) -> (Int, Int)
func count(kids: Dictionary<String, String>) ->
    (girls: Int, boys: Int) {
    return (1, 2)
}

2.函数作为变量,这也验证了函数类型和函数作为值来进行赋值

var countFunc: (Dictionary<String, String>) -> (Int, Int) = count

let kids: Dictionary<String, String> = ["123" : "456"]
print(countFunc(kids))

3.函数类型作为返回值

// 这个示例是这样的,我们根据用户的输入("吃""喝")来选择不同的函数进行打印
typealias NoParameterFunc = (() -> ()) // 可以为一个类型起一个别名
func eat() -> Void {
    print("吃了一块饼干")
}
func drink() -> Void {
    print("喝了一杯水")
}

func doSomethingWithIdentifier(identifier: String) -> (NoParameterFunc)? {
    switch identifier {
    case "吃":
        return eat  //因为我们返回的是一个函数类型,所以使用eat,要是使用eat()就返回一个函数了
    case "喝":
    return drink
    default:
        return nil
    }
}

let doSomething = doSomethingWithIdentifier(identifier: "吃")
if  let doSomething = doSomething {
    doSomething() //调用函数
}

4.嵌套函数

// 函数内部依然可以有函数,我们队上边的例子进行改造,结果一样
func anotherDoSomethingWithIdentifier(identifier: String) -> (NoParameterFunc)? {

    func eat1() -> Void {
        print("吃了一块饼干")
    }
    func drink1() -> Void {
        print("喝了一杯水")
    }
    switch identifier {
    case "吃":
        return eat1  //因为我们返回的是一个函数类型,所以使用eat,要是使用eat()就返回一个函数了
    case "喝":
        return drink1
    default:
        return nil
    }
}

5.柯里化函数

在swift3.0中已经被移除,原因是使用场景不多,且使语言变得复杂,大家了解下就好了

func add(a: Int, b: Int, c: Int) -> Int {
    return a + b + c
}

let d = add(a: 1, b: 2, c: 3)

// swift3.0中支持的柯里化
func addCur(a: Int) -> (_ b: Int) -> (_ c: Int) -> Int {
    return {
        (_ b: Int) -> (_ c: Int) -> Int  in
        return {
            (_ c: Int) -> Int in
            return a + b + c
        }
    }
}

6.闭包

func compare(l1: Int, l2: Int) -> Bool {
    return l1 > l2
}

let numbers = [2, 3, 6, 8, 1]
let sortedNumbers = numbers.sorted(by: { (l1: Int, l2: Int) -> Bool in return l1 > l2})
print(sortedNumbers)

let sortedNumbers1 = numbers.sorted(by: { (l1, l2) in l1 > l2})
print(sortedNumbers1)

let sortedNumbers2 = numbers.sorted(by: { $0 > $1})
print(sortedNumbers2)

let sortedNumbers3 = numbers.sorted(by: >)
print(sortedNumbers3)

// 尾闭包函数
// 当函数中的参数中使用了闭包,而且闭包内部很复杂,且闭包是最后一个参数时,才能使用尾闭包
let sortedNumbers4 = numbers.sorted() { // 同样是上边的例子,我们可以使用尾闭包,好处是增加代码的阅读性
    $0 < $1
}
print(sortedNumbers4)

总结

基本上掌握了这些函数的使用,在开发中也就够用了,要进阶,可以多了解函数响应式编程。

时间: 2024-10-01 07:21:06

Swift 1的相关文章

Apple Swift编程语言新手教程

Apple Swift编程语言新手教程 作者: 日期: gashero 2014-06-03 FROM:http://gashero.iteye.com/blog/2075324 文件夹 1   简单介绍 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 7   枚举与结构 1   简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的

swift 深入理解Swift的闭包

我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: var str:String={ return "JobDeer" }() 闭包还可以这么定义,省略了等号和括号: var str:String{ return "JobDeer" } 闭包中可以定义get方法. var str:String{ get{ return

在Swift结构体中如何实现写时复制?

结构体(Struct)在Swift语言中占有重要地位,在Swift标准库中,大约有90%的公开类型都是结构体,包括我们常用的Array.String.Dictionary.结构体相比类,一个最重要的特性就是它是值类型,而类似引用类型.值类型是通过复制值来赋值的,而不是引用同一个内存地址,这样就不存在数据共享的问题,能防止意外的数据改变,并且它是线程安全的. 举一个很简单的例子,在objc中,数组是类,是引用类型,在Swift中,数组是结构体,是值类型.因此下面的代码中: let array1 =

Swift学习之位移枚举的按位或运算

在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift语言里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 //位移枚举typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutores

Swift - 用UIScrollView实现视差动画效果

效果 源码 https://github.com/YouXianMing/Swift-Animations // // MoreInfoView.swift // Swift-Animations // // Created by YouXianMing on 16/8/18. // Copyright © 2016年 YouXianMing. All rights reserved. // import UIKit class MoreInfoView: UIView { var imageV

Swift 入门之简单语法(一)

定义 let 定义常量,一经赋值不允许再修改 var 定义变量,赋值之后仍然可以修改 //: # 常量 //: 定义常量并且直接设置数值 let x = 20 //: 常量数值一经设置,不能修改,以下代码会报错 // x = 30 //: 使用 `: 类型`,仅仅只定义类型,而没有设置数值 let x1: Int //: 常量有一次设置数值的机会,以下代码没有问题,因为 x1 还没有被设置数值 x1 = 30 //: 一旦设置了数值之后,则不能再次修改,以下代码会报错,因为 x1 已经被设置了数

Swift和Java关于字符串和字符的比较

1. 字符串字面量 Swift和Java关于字符串操作大同小异. Swift:字符串字面量(String Literals):我们可以在代码中包含一段预定义的字符串值作为字符串字面量. 字符串字面量是由双引号 ("") 包裹着的具有固定顺序的文本字符集.字符串字面量可以用于为常量和变量提供初始值. 代码如下: let someString = "Some string literal value" 字符串字面量可以包含以下特殊字符: 转义字符\0(空字符).\\(反

Swift Tour

设置常数使用let,设置变量使用var var myVariable = 42 myVariable = 50 let myConstant = 42 编译器可以自己推断出变量类型因此不用显式限定. 如果没有赋初值或信息不足以让编译器判断,则可以通过冒号显式声明: let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double = 70 任何变量类型都不可以隐式转换,所有变量之间的转换都为显式: let

Swift备忘录

Swift 备忘录 2015-4 一.简介 1.Swift 语言由苹果公司在2010年7月开始设计,在 2014 年6月推出,在 2015 年 12 月 3 日开源 2.特点(官方): (1)苹果宣称 Swift 的特点是:快速.现代.安全.互动,而且明显优于 Objective-C 语言 (2)可以使用现有的 Cocoa 和 Cocoa Touch 框架 (3)Swift 取消了 Objective-C 的指针及其他不安全访问的使用 (4)舍弃 Objective-C 早期应用 Smallta

Swift -- 语言指南--高级运算符

原文地址: http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可