Lesson_Swift2

// Playground - noun: a place where people can play

import UIKit

//=================================================================
//函数
//
//    func 函数名 (参数列表) -> 返回类型 {
//        代码块
//    }


func sayHi(name: String) -> String {
    return "Hi, " + name
}


var letter = "aeibcd1234"
//a i b
//e c d
//数字

func countLetter(letter: String) -> (Int, Int, Int) {
    var aib = 0
    var ecd = 0
    var num = 0
    
    for c in letter.lowercaseString {
        switch c {
        case "a", "i", "b":
            aib++
        case "e", "c", "d":
            ecd++
        default:
            num++
        }
    }
    
    return (aib, ecd, num)
}

countLetter(letter)


//=================================================================
//函数类型的变量
//有点类似之前学过的函数指针
var funcType: String -> String = sayHi
funcType("蓝鸥")

func sayBye(name: String) -> String {
    return "Bye! " + name
}

funcType = sayBye
funcType("蓝鸥")

//参数没有名字,我们需要添加一个外部形参
//1.在参数前加一个外部形参名 注:不能在函数中使用外部形参名
//2.在参数名前加 #
func personInfo(name personName: String, #sex: String, _age: String = "18") -> String {
    return personName + " " + sex + " " + _age
}

personInfo(name: "隔壁老王", sex: "男")

//可变参数, 都是相同类型的参数
func sum(numbers: Float...) -> Float {
    var sum: Float = 0.0
    
    for number in numbers {
        sum += number
    }
    
    return sum
}

sum(1.0, 2.0, 3.0, 4.0, 5.0)

//如果需要用到参数运算(修改参数的值), 需要在此之前加var修饰
func hanshu(var a: Int, b: Int) {
    a += 3
}

var number = 5

var number1 = 5
var number2 = 3

// inout关键字: 如果说我们改变传递的值,则需要用inout修饰变量
//传递参数的时候,需要用&

func swap(inout number1: Int, inout number2: Int) {
    var temp = number1
    number1 = number2
    number2 = temp
}

swap(&number1, &number2)
number1
number2

func sixPlus(price: Float) -> Float {
    return price * 0.8
}


//函数类型作为返回值
//隐藏掉 不希望被人能看到内部的方法
func changeValue(plus: Bool) -> Int -> Int {
    func plusOne(number: Int) -> Int {
        return number + 1
    }
    
    func minusOne(number: Int) -> Int {
        return number - 1
    }
    
    return plus ? plusOne : minusOne
}

changeValue(true)
var cc: Int -> Int = changeValue(false)
cc(20)


//=============================================================
//闭包
//闭包跟OC的block一样

//用法
//{
//      (参数列表)->返回值 in
//      闭包的实现
//{


var names = ["Qiaoming", "kan", "taobao"]

var sortedNames1:() = sort(&names, {
    (stringA: String, stringB: String) -> Bool in
    return stringA > stringB
})

names


//去掉类型,通过类型推断自动获取类型
//单行可以去掉return
var sortednames2:() = sort(&names, {
    (s1, s2) -> Bool in
     s1 < s2
})

names

//---------------------------------------
var sortesNames3:() = sort(&names, {
    return $0 > $1
})
// $0表示第一个数 $1表示第二个数
names


//---------------------------------------
var sortesNames4:() = sort(&names, <)
names


//---------------------------------------
sort(&names) { (s1, s2) -> Bool in
    return s1 > s2
}
names

//=====================================================================
//类 结构体

/**
    相同点:
    1.都可以定义属性
    2.都可以定义方法,这是swift跟oc的明显的区别之一
    3.都可以定义构造器(初始化方法)
    4.都可以遵循协议
    5.都可以被扩展

    不同点:
    1.类可以继承,而结构体不能
    2.类可以被类型推断
    3.类可以通过析构释放内存
    4.类他是引用类型,结构体是值类型
*/

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。