Swift 2 学习笔记 8.函数

课程来自慕课网liuyubobobo老师


函数
  • 函数基础
func sayHello(name: String?) -> String {
    return "Hello " + ( name ?? "Guest" )
}

var nickname: String? = nil
sayHello(name: nickname)
  • 使用元组返回多个值
func findMaxAndMin( numbers: [Int] ) -> ( max: Int, min: Int )? {
    if numbers.isEmpty {
        return nil
    }
    var minValue = numbers[0]
    var maxValue = numbers[0]
    for number in numbers {
        minValue = minValue < number ? minValue : number
        maxValue = maxValue > number ? maxValue : number
    }
    return (maxValue, minValue)
}

var scores: [Int]? = [21,123,53,122,33,252]
scores = scores ?? nil
if let result = findMaxAndMin(numbers: scores!) {
    print(result.max)
    print(result.min)
}
  • 函数的命名
func sayHello(to name: String, with greeting: String) -> String {
    return "\(greeting),\(name)"
}

sayHello(to: "imooc", with: "Hello")

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

mutiple(4, 2)
  • 默认参数值
func sayHello(to name: String = "Playground", with greeting: String = "Hello") -> String {
    return "\(greeting),\(name)"
}

sayHello(to: "imooc", with: "Hi")  // Hi,imooc
sayHello(to: "bobobo")  // Hello,bobobo
sayHello()// Hello,Playground
  • 可变参数
func mean(_ numbers:Double ...) -> Double {
    var sum:Double = 0
    // 将变长参数当做一个数组看待
    for number in numbers {
        sum += number
    }
    return sum/Double(numbers.count)
}

mean(2)  // 2
mean(2,3)  // 2.5
mean(2,3,41,5,1,23,4,52)  // 16.375


func sayHello(to names: String ... , with greeting: String = "Hello") {
    for name in names {
        print("\(greeting),\(name)")
    }
}

sayHello(to: "A","B","C", with: "Hi")
  • 常量参数、变量参数和inout参数 -> Swift3
// 变量参数不再使用
// inout关键字写在参数后面
// 交换两个整型
func swapTwoInts(_ a: inout Int , _ b : inout Int) {
    (a,b) = (b,a)
}
var numA: Int = 3
var numB: Int = 4
swapTwoInts(&numA, &numB)
numA  // 4
numB  // 3

// 将一个整型数组每一个元素都初始化成0
func initArray(arr: inout [Int], by value:Int ) {
    for i in 0..<arr.count {
        arr[i] = value
    }
}
var arr = [1,2,3]
initArray(arr: &arr, by: 0)
arr  // [0,0,0]
  • 函数类型
// 产生一个随机数组
var arr: [Int] = []
for _ in 0..<100 {
    arr.append(Int(arc4random()%1000))
}
// 按从大到小排序
func biggerNumberFirst (a: Int , b: Int) -> Bool {
    return a > b
}
arr.sort(by: biggerNumberFirst)
// 按最接近500排序
func near500 (a: Int, b: Int) -> Bool {
    return abs(a-500) < abs(b-500) ? true : false
}
arr.sort(by: near500)
  • 函数式编程初步
func changeScores ( scores: inout [Int], by changeScore:(Int) -> Int ) {
    for (index,score) in scores.enumerated() {
        scores[index] = changeScore(score)
    }
}

func changeScore1 (score: Int) -> Int {
    return Int(sqrt(Double(score))*10)
}

func changeScore2 (score: Int) -> Int {
    return Int(Double(score)/150.0*100.0)
}

var scores1 = [67,72,45,96,80]
changeScores(scores: &scores1, by: changeScore1)

var scores2 = [123,78,96,102,88]
changeScores(scores: &scores2, by: changeScore2)


//map
var scores = [67,72,45,96,80]
scores.map(changeScore1)  // [81, 84, 67, 97, 89]
scores  // [67,72,45,96,80]

//filter
func fail(score: Int) -> Bool {
    return score < 60
}
scores.filter(fail)  // [45]
scores  // [67,72,45,96,80]

//reduce
func add(num1: Int, num2: Int ) -> Int {
    return num1 + num2
}
scores.reduce(0, add)  // 360
scores.reduce(0, +)  // 360
  • 返回函数类型和函数嵌套
// 两种邮费计算方法
func tier1MailFee(by weight: Int) -> Int {
    return 1 * weight
}

func tier2MailFee(by weight: Int) -> Int {
    return 3 * weight
}
// 计算商品总花费(邮费+商品价格)
func fee(price: Int, weight: Int) -> Int {
    // 嵌套选择邮费计算方法的函数
    func chooseMailFeeCalculation(by weight: Int) -> (Int) -> Int {
        return weight <= 10 ? tier1MailFee : tier2MailFee
    }
    
    let mailFeeByWeight = chooseMailFeeCalculation(by: weight)
    return mailFeeByWeight(weight) + price
}

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

推荐阅读更多精彩内容