iOS中 Swift初级入门学习(二)

//  Copyright (c) 2015年 韩俊强. All rights reserved.
//

import Foundation
/*
// 控制语句
// for - in
// 遍历字符串
for character in "hello,word" {
    println(character)
}

// 变量数组
let array = ["小韩哥","小妹妹","二妹子","小美女","二美女","习大大"]

for element  in array {
    println(element)
}

// 同时取出数组中的下标和元素
for (index,element) in enumerate(array) {
    println("index = \(index), element = \(element)")
}

// 遍历字典中的key,value
let dict = ["name":"小韩哥","age":18,"gender":"男"]
for (key,value) in dict {
    println((key,value))
}

// 遍历字典中的所有keys
for key in dict.keys {
    println(key)
}

// 遍历字典中的所有的values
for value in dict.values {
    println(value)
}

// 遍历区间
for number in 1...10 {
    println(number)
}

// 计算2的8次幂
// _ 在这里是忽略该值的意思
var result = 1
for _ in 1...8 {
    result *= 2
}
println(result)

// for 循环
result = 0
for var i = 0; i <= 100; i++ {
    result += i
}
println(result)

// while 循环
result = 0;
var i = 0
while i <= 100 {
    result += i
    i++
}
println(result)

// do...while 循环
// do...while 和 while 的区别就是 do...while循环不管条件真假, 都会执行一次循环体
while false {
    println("hello, word")
}

do {
   println("hello,word")
}while false

// if 分支语句
// Swift当中,赋值语句没有返回值, 我们不能把赋值语句作为判断条件
let genderOfSuoNing = "女"
if genderOfSuoNing == "女" {
    println("hello, word!!!!")
}else{
    println("去泰国吧")
}

// 级联式
let numberOfFriends = 5
if numberOfFriends == 1 {
    println("打台球")
}else if numberOfFriends == 2 {
    println("斗地主")
}else if numberOfFriends == 3 {
    println("打麻将")
}else if numberOfFriends == 4 {
    println("旅游")
} else {
    println("KTV")
}

// if 语句值绑定
// 我们通过if语句可以给一个常量或者变量赋一个可选类型的值, 不用通过强制解析
var optionalNumber : Int? = 10
if let number = optionalNumber {
    println("number = \(number)")
} else {
    println("没有赋值成功")
}

// switch 语句
// Swift当中, 两个case语句之间默认是不贯穿的, 我们不用加break关键词
let phoneNumber = 5
switch phoneNumber {
case 1:
    println("一楼分级")
case 2:
    println("二楼分级")
case 5:
    println("三楼分级")
 // 如果想执行下面的case语句, 我们可以加一个关键字 fallthrough
    fallthrough
default:
    println("对不起,您拨打的电话正在通话中")
}

// continue, break 关键字
for var i = 0; i < 5; i++ {
    if i == 3{
        // 结束本层循环
        break
    }
    println("i = \(i)")
}

for var i = 0; i < 5; i++ {
    if i == 3{
        // 结束本次循环
        continue
    }
    println("i = \(i)")
}

// 标签语句
小韩哥 : while true {
    for var i = 0; i < 10; i++ {
        if i == 5 {
            break 小韩哥
        }
        println("i = \(i)")
    }
}

// 区间匹配
let moneyOfHjq = 200
switch moneyOfHjq {
case 1..<10:
    println("只有几块钱")
case 10..<100:
    println("只有几百块钱")
default:
    println("有好多钱呢")
}

// 元组匹配
// case 语句中的元组, 只要有一个条件满足, 元组就不会匹配值, 如果执行了一个case语句, 那么除非加上fallthrough 关键字,否则下面的case语句就不会执行
let aTuple = (5,6)
switch aTuple {
case (let x,7):
    println("x = \(x)")
case (5,let y):
    println("y = \(y)")
default:
    println("没有匹配成功")
}

// where 关键字 , 加一个判断条件, 相当于且的意思
switch aTuple {
case (let x, let y) where x > y:
    println("x = \(x),y = \(y) x > y")
case (let x,let y) where x < y:
    println("x = \(x),y = \(y) x < y")
default:
    println("x = y")
}

// _ 任意值. 忽略该值
let somePoint = (0,2)
switch somePoint {
case (0,0):
    println("该点在原点")
case (0,_):
    println("该点在y轴上")
case (_,0):
    println("该点在x轴上")
default:
    println("该点在坐标系上")
}


*/

// 函数
// 语法 func 函数名(参数) -> 返回值 { 执行语句 }
// 无参,无返回值
// 无返回值的花, -> Void 可以省略
func printHello() -> Void {
    println("Hello, word")
}

func printHi(){
    println("Hi,你好啊")
}
// 函数的调用
printHello()
printHi()

// 无参,有返回值
func returnAString() -> NSString {
    return "太棒了,下雪了"
}
let aString = returnAString()
println("aString = \(aString)")

// 有参,有返回值
func returnUpprtCaseOfStr(Str: String) -> NSString {
    return Str.uppercaseString
}
let result = returnUpprtCaseOfStr("abc")
println("result = \(result)")

// 有参,无返回值
func printStringWithAStr(str : String) {
    println("str = \(str)")
}
printStringWithAStr("hello,word")

// 返回一个元组
func returnMangElement(str:String) -> (String,String) {
    return (str.uppercaseString,str.lowercaseString)
}

let 元组 = returnMangElement("aBc")
println(元组.0,元组.1)

var array = ["hello","hi"]
array.removeAll(keepCapacity: false)

// personName 是外部参数, 让使用者很方便的知道我们需要传入什么样的参数, 但是这个外部参数对内部参数没有任何影响
func printStr(personName str: String){
    println("name = \(str)")
}
printStr(personName: "啦啦啦")

// #号的作用, 让我们这个参数在内部可以使用, 在外部可以让使用者看到
func printAStr(#personName : String){
    println("name = \(personName)")
}
printStr(personName: "你好")

// 求两个数的和的函数
// 函数的类型 (Int,Int) ->Int
func addTwoNumber(num1 : Int, num2 : Int) ->Int {
    return num1 + num2
}

// 求两个数的积的函数
func mulTwoNumber(num1:Int,num2: Int) ->Int {
    return num1 * num2
}
// 根据类型推断, aFunction就是一个函数, 类型为(Int,Int) ->Int
var aFunction : (Int,Int) ->Int = addTwoNumber

let result2 = aFunction(5,6)
println("result = \(result2)")

aFunction = mulTwoNumber
let result3 = aFunction(5,6)
println("result3 = \(result3)")

// 函数作为返回值
func returnAFunction(judge: Bool) ->(Int,Int) ->Int {
    return judge ? addTwoNumber : mulTwoNumber
}
var resultFunction = returnAFunction(true)
let result4 = resultFunction(5,6)
println(result4)

// 函数作为参数
func hanshu(funcName : (Int,Int) ->Int,num1:Int,num2:Int){
    let result = funcName(num1,num2)
    println("result = \(result)")
}

hanshu(addTwoNumber , 9, 8)

// 函数内部函数
func functionEmbedFunction(judge: Bool,number:Int){
    
    // 函数内部的函数只能在该函数内部调用
    // 函数的参数默认是不可变的, 如果想要改变函数参数的值, 我们需要把该参数用 var 修饰
    func addNumber(var num:Int){
        println(++num)
    }
    func reduceNumber(var num:Int){
        println(--num)
    }
    judge ? addNumber(number) : reduceNumber(number)
}

functionEmbedFunction(true, 19)
functionEmbedFunction(false, 30)

// 闭包
// 闭包含函数代码块
// 语法
     /*
{
   (参数) ->返回值 in
    执行语句
}
    */

let blockValue = {
    (str:  String) ->String in
    return "hello" + str
}

// 闭包的调用
let resultOfBlock = blockValue("word")
println(resultOfBlock)

// 枚举
// 值类型
// 如果枚举是整形值的话, 和我们C语言中枚举的用法基本相同, 如果不给参数赋初始值, 参数默认从0开始,递增
enum Season : Int{
    case Spring
    case Summer
    case Autumn
    case Winter
}
var currentSeason = Season.Winter
println(currentSeason)

// 通过 .rawValue可以取出枚举值
println(currentSeason.rawValue)

// 如果枚举类型不是整形, 我们需要给枚举的成员变量赋值
enum FromWhere : String {
    case North = "北方"
    case South = "南方"
    case West = "西方"
    case East = "东方"
}
var currentLocation = FromWhere.North
println(currentLocation.rawValue)

// 如果我们已经知道变量是什么枚举类型, 那么我们给他赋值的时候, 就可以省略,枚举名, 通过 .成员变量的方式直接给他赋值
currentLocation = .West
println(currentLocation.rawValue)

//  验证枚举类型是值类型还是引用类型
var anotherLocation = currentLocation
anotherLocation = .East
switch currentLocation {
case .West:
    println("以前的值没有发生变化, 枚举是值类型")
default:
    println("值发生了变化, 枚举是引用类型")
}

// 类
// 引用类型, 声明一个类我们用关键字 class 来修饰
class Student {
    // 属性
    var name : String!
    var age : Int!
    var gender : String!
    func printInfoOfStudent(){
        println("name = \(name),age = \(age),gender = \(gender)")
    }
}
// 通过构造方法创建一个学生实例
// 用let修饰类的实例, 如果属性是可变的, 那么我们就能修改该属性, 如果属性是不可变的, 我们就不能修改该属性
let student = Student()
student.name = "小韩"
student.age = 18
student.gender = "男"

student.printInfoOfStudent()
let student2 = student
student2.name = "小妹"
student2.gender = "女"
student2.age = 20

student2.printInfoOfStudent()

// 因为student是用let修饰的,我们不能改变student
//student = student2

// 结构体
// 值类型, 声明结构体我们用struct关键词
// 和类的区别: 类可以被继承, 结构体不可以
struct People{
    // 属性
    var name : String
    var age : Int
    var gender : String
    // 方法
    func printInfoIfPeople(){
        println("name : \(name),age : \(age),gender : \(gender)")
    }
}
// 结构体属性不用赋初始值, 因为结构体默认有一个逐一构造器, 通过这个方法, 我们可以给每一个属性
let people = People(name: "小白", age: 21, gender: "男")
people.printInfoIfPeople()
// 结构体实例如果用let修饰, 即使结构体的属性是可变的, 该实例的属性也不能发生改变, 要想修改该实例的属性, 我们需要用var来修饰该实例
//people.name = "小花"

// 验证结构体是引用类型还是值类型_值类型
var people1 = People(name: "静静", age: 18, gender: "男")
var people2 = people1
people2.name = "哈哈"
people1.printInfoIfPeople()



你可能感兴趣的:(编程语言,swift,ios开发,韩俊强的博客,swift入门)