Swift基础学习的总结(三)

今天学习的内容是有关函数、闭包的知识.
1.函数

  • 1.1 函数名、函数参数命名
    苹果编写函数的风格,就是函数的命名更加类似于自然语句,有着非常强的可读性.正常我们的函数是是这样定义的:
func sayHelloTo(name: String, greeting: String) -> String {
    return "say \(greeting) to \(name)"
}

sayHelloTo("jf", greeting: "hello")

参数:greeting 既是函数外部参数名,也是函数内部参数名
要是我们想要区分开,使得调用时,语义看起来更明确,又不会影响内部函数的参数调用,这时我们应该这样写:

func sayHelloTo(name: String, withGreeting greeting: String) -> String {
    return "say \(greeting) to \(name)"
}

sayHelloTo("jf", withGreeting: "hello")

还有一种情况,函数名已经十分明确了,这时候我们不需要函数外部参数名,该如何定义呢,请看:

func mutiply(num1: Int, _ num2: Int) -> Int {
    return num1 * num2
}

mutiply(1, 3)
  • 1.2 默认参数值和可变参数值
    有默认参数值
// 建议有默认参数值的参数放在最后面
func sayHelloTo(name: String, withGreeting greeting: String = "Hello") -> String {
    return "say \(greeting) to \(name)"
}

sayHelloTo("dd")
sayHelloTo("jf", withGreeting: "hello")

变长的参数类型,对于一个函数最多有一个变长参数类型

func sayHelloTo(names: String ..., withGreeting greeting: String) {
    for name in names {
        print("\(name), \(greeting)")
    }
}

sayHelloTo("jf", "DC", withGreeting: "Hello")
  • 1.3 常量参数、变量参数、inout参数
    一般,我们传入函数的参数是默认为常量参数,如果需要一个变量参数(事实上,由于面向函数的原则,不建议声明架构一个函数包含有变量参数。),则需要在函数体内标注:var num = num.
// 十进制数转二进制
func toBinary(num: Int) -> String {
    var num = num
    
    var res = ""
    
    repeat {
        res = String(num % 2) + res
        num /= 2
    } while num != 0
    
    return res
}

toBinary(12)

inout参数:可以改变传入的值,做到按引用传入.

// 交换两个整数
func swapTwoInts(inout a: Int, inout _ b: Int) {
    let t: Int = a
    a = b
    b = t
}

var x = 1
var y = 2

swapTwoInts(&x, &y) // 传入参数前加上&
x // 2
y // 1
  • 1.4 函数型类型
    函数本身是可以被当做变量的
// 函数本身是可以被当做变量的
var array1 = ["F", "P", "C", "D", "A", "S"]
func stringSortDesc(a: String, _ b: String) -> Bool {
    return a > b
}

let array2 = array1.sort(stringSortDesc)
array2


func sayHelloTo(names: String ..., withGreeting greeting: String) {
    for name in names {
        print("\(name), \(greeting)")
    }
}

func toBinary(num: Int) -> String {
    var num = num
    
    var res = ""
    
    repeat {
        res = String(num % 2) + res
        num /= 2
    } while num != 0
    
    return res
}

// 函数变量
let tobinary: (Int)->String = toBinary
let sayhello: (String ...,String)->() = sayHelloTo

下面了解初步的函数式编程例子

var score = [99, 20, 60, 80, 30, 21]

// map
func isPassOrFail(score: Int) -> String {
    return score < 60 ? "Fail" :"Pass"
}

score.map(isPassOrFail)

// filter
func arrayLower60(score: Int) -> Bool {
    return score < 60
}

score.filter(arrayLower60)

// reduce
func concatenate(str: String, score: Int) -> String {
    return str + "\(score)" + " "
}

score.reduce("", combine: concatenate)

// 从大到小-转成字符串
score.sortInPlace { (score1, score2) -> Bool in
    return score1 > score2
}
score.reduce("", combine: concatenate)
  • 1.5 返回值为函数类型,函数嵌套
    例如:
对于买家购买的商品,所付的钱 = 邮费 + 单价 * 体重/钱
而邮费的计算是根据体重,有不同的标准
标准1:小于20,邮费 =  体重
标准2:大于20,邮费 =  体重 * 2
func postage1(weight: Int) -> Int {
    return weight
}

func postage2(weight: Int) -> Int {
    return weight * 2
}

func choosePostage(weight: Int) -> (Int) -> Int {
    return weight < 20 ?postage1 :postage2
}

func calculateGoodPrice(weight: Int, price: Int) -> Int {
    let postage = choosePostage(weight)
    
    return postage(weight) + weight * price
}

calculateGoodPrice(30, price: 10)

函数嵌套

func postage1(weight: Int) -> Int {
    return weight
}

func postage2(weight: Int) -> Int {
    return weight * 2
}

func calculateGoodPrice(weight: Int, price: Int) -> Int {
    func choosePostage(weight: Int) -> (Int) -> Int {
        return weight < 20 ?postage1 :postage2
    }
    
    let postage = choosePostage(weight)
    
    return postage(weight) + weight * price
}

calculateGoodPrice(30, price: 10)

2.闭包
闭包和函数本质上是一致的,都属于引用类型.
学过OC的朋友,就可以把闭包当做block来理解.
闭包的基本语法

let hello = {(name: String, greeting: String) -> String in
    // 函数体
    return "\(name): \(greeting)"
}

一对大括号,参数列表,返回类型,关键字in,加上函数体

结尾闭包:若函数最后一个参数是闭包,则闭包可以写在小括号()后面,例如

let showView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
let rectangle = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))

showView.addSubview(rectangle)
rectangle.center = showView.center
rectangle.backgroundColor = UIColor.redColor()

UIView.animateWithDuration(2.0) { 
    rectangle.backgroundColor = UIColor.blueColor()
    rectangle.frame = showView.frame
}

内容捕获:在闭包内,可以获取到闭包外的变量(但是得注意内存问题,还有待研究)

为大家介绍用typealias,为闭包重新定义名字

typealias SayHello = (name: String, greeting: String) -> Void

let sayHello: SayHello? = {name, greeting in
    print("\(name): \(greeting)")
}

sayHello!(name: "jj", greeting: "Hi")


let hello = {(name: String, greeting: String) -> String in
    // 函数体
    return "\(name): \(greeting)"
}

swift中没有main函数
@UIApplicationMain:表示程序入口

大家赶紧去试试吧!

刘雨波Demo地址:
Play-with-Swift-2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容