Swift入门(二)

函数

函数的定义、参数、返回值

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

可以省略参数和返回值

func sayGoodbye(personName: String) {
    println("Goodbye, \(personName)!")
}

也可以包含多个参数和多个返回值

func count(string1: String, string2: String) -> (vowels: Int, consonants: Int, others: Int) {
    var vowels = 0, consonants = 0, others = 0
    for character in string1 {
        switch String(character).lowercaseString {
        case "a", "e", "i", "o", "u":
            ++vowels
        case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
          "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
            ++consonants
        default:
            ++others
        }
    }
    return (vowels, consonants, others)
}

多重返回值返回的是一个元祖,没有返回值时其实返回的是Void,一个空的元祖

参数名

参数名一般只能函数内部使用,但为了使语言表达更清晰,可以定义外部参数名,使用这些外部参数名使代码更易阅读

func join(string s1: String, toString s2: String, withJoiner joiner: String) -> String {
    return s1 + joiner + s2
}

join(string: "hello", toString: "world", withJoiner: ", ")

外部名可以与内部名保持一致

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")

函数参数可以提供默认值

func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") -> String {
    return s1 + joiner + s2
}

join(string: "hello", toString:"world")
// returns "hello world"
join(string: "hello", toString: "world", withJoiner: "-")
// returns "hello-world"

对提供了默认值的参数,参数名自动表示为内部名和外部名

输入输出参数inout,表示参数可以被函数体修改,并保留给外部继续使用

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

调用时需要在参数前加&

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)

函数类型

函数类型由参数类型和返回值类型共同决定,类似c语言的函数指针

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
println("Result: \(mathFunction(2, 3))")

mathFunction = multiplyTwoInts
println("Result: \(mathFunction(2, 3))")

函数类型与其他类型一样,可以做参数,也可以做返回值

func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}

var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)

函数可以嵌套

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
}

闭包

闭包特性应用在嵌套函数和闭包表达式中,是一种函数式编程特性

闭包表达式

一般形式如下

{ (parameters) -> returnType in
    statements
}

例如

reversed = sorted(names, { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

// 闭包可以类型推断,所以可以简化为
reversed = sorted(names, { s1, s2 in return s1 > s2 } )
// 单行表达式可以省略返回的return
reversed = sorted(names, { s1, s2 in s1 > s2 } )
// 还可以缩写参数
reversed = sorted(names, { $0 > $1 } )

如果闭包函数很长,为了增强可读性,可以讲闭包函数放到()外边紧跟函数调用,

func someFunctionThatTakesAClosure(closure: () -> ()) {
    // 函数体部分
}
// 以下是使用尾随闭包进行函数调用
someFunctionThatTakesAClosure() {
  // 闭包主体部分
}

捕获值

闭包可以在其定义的上下文中捕获常量或变量。 即使定义这些常量和变量的原域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen = makeIncrementor(forIncrement: 10)

incrementByTen()
// 返回的值为10
incrementByTen()
// 返回的值为20
incrementByTen()
// 返回的值为30
时间: 2024-11-03 06:42:36

Swift入门(二)的相关文章

Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法. 首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法.下面先贴上代码,然后解释一下这段代码. //String+Operation.swifft import Foundation //逆序输出swift中的字符串 extension String{ func Reverse()

Swift入门教程:基本语法(二)

数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   // 1999.0 可以增加额外的下划线 _ ,以增强可读性 let oneMillion1 = 1_000_000    // 1000000 let oneMillion2 = 100_0000      // 1000000 let overOneMillion = 1_000_000.000

Swift入门(五)——数组(Array)

集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,分别是数组(Array)和字典(Dictionary).他们的主要区别在于数组中的元素由下标确定,而字典中的数据的值由数据的键(Key)决定.以下我们认为集合就是数组或字典. 集合的可变性 我们可以定义一个集合常量或者集合变量.一旦定义为常量,就意味着集合的长度.内容和顺序都不能再修改了.比如,定义为常量的数组,不能再向其中添加新的元素. 数组的创建 由于swift中变量的创建遵循" var 变量名:变量类型 "的语法

Swift入门(九)——String与Int、Double、Float等数字相互转换

三种转换模式 任何语言里面,Int.float.double等数字类型自成一派,但它们和String类型之间的转换总是不太方便,这里总结一下它们相互转换的方法.总结下来一共有三种转换模式,分别举例说明. 一.String转数字 这里以String类型转Int类型为例.String转其他的数字类型(Float.Double等)大同小异.主要用到的方法是String类型的toInt方法.注意这个方法返回的是Int?,即一个整数可选类型.所以需要解封. var string = "1234"

Swift入门(三)——元组(Tuple)

定义 元组是一个包含了若干个相关联变量的对象. 元组的创建 var newTuple = ("kt",20) //由于Swift的类型推导,newTuple被推导为(String,Int)类型的变量 元组的解绑 几个变量一旦联合在一起,组成了一个元组,他们就被"绑定"了,要想从一个元组中单独取出某一个数据时,需要解绑元组. 直接解绑 直接解绑是最简单的一种解绑方式,只要定义若干个变量与元组中的变量一一对应即可. var newTuple = ("kt&qu

Swift入门篇-结构体

前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中是灰常重要的一部分,如果您很好的掌握结构体,在后面ios开发中,会理解的更加清楚. 一:结构体声明 格式: struct 结构体名 { } 说明: 1: struct 是定义结构体的关键字 例子 /* 1:struct 是结构体的关键字 2:student 结构体名称 3:student() 创建一

Swift入门篇-集合

一:数组 一:可变数组 定义:数组使用有序列表存储相同类型的多重数据. 格式: 第一种格式 var 变量: 类型[] = [变量值,变量值,...] 第二种格式 var 变量 =[变量值,变量值,...] 说明: 1:[变量值,变量值...] 这样表示数组 ,前提是 变量值的类型必须一值.(和其他语言有所不同) 2:上面两种格式都是定义一个数组,数组中的变量值的类型必须一致 3:第一种格式定义的数组,是直接定义数组,第二种格式定义的数组 是编译器通过类型值推导出是数组格式 注意点 1:常量关键字

Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么? 首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量. var stringValue = "5" var intValue = stringValue.toInt(); println("intvalue = \(intValue)") 执行以上方法后得到了奇怪的结果: intvalue = Optional(5) 其实,可以发现,toInt方法的返回值并不是Int,而是In

Swift入门篇-基本类型(1)

博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 今天遇到了一个很烦的事情是,早上10点钟打开电脑,一直都进入系统(我的系统  mac OS X Yosemite 10.10 系统),一直卡在登陆界面上进不去,心里想苹果新系统这么脆弱,现在很多软件不兼容就算了,搞的我还进不了系统,真是郁闷.然后在google 上搜索,google也打不开(真是悲催, 据说"组织" 要开会,大家先不要用google).然后用"度娘"搜索,搜了半天,终于找到

Swift入门(十一)——类型转换与is、as操作

三种操作:is.as?和as! Swift是强类型语言,但也允许开发者通过is.as?和as!这三种操作来对类型进行判断和强制转换.其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强制形式.在这里强调一下,swift中比较常用的向下转换(downcast)是没有as操作符的. 为了方便后面的解释,这里假设定义了三个类,Fruit.Apple和Orange,其中Apple和Orange都继承自Fruit. is操作符 is操作用来判断某一个对象是否是某一个特定的类,它会返回一个b