Swift简介(二)

作者: StoneLeon | 来源:发表于2015-12-03 15:55 被阅读101次

    在学习Swift的过程中,加入与OC的对比,这样更好理解,记忆.

    1.0 if和switch分支:

    --if:

    /*Swift中的if和OC中的if"几乎"一模一样

    * Swift中的if可以省略后面的圆括号

    * OC中的if如果后面只有一条语句, 那么大括号可以省略, 而Swift中不行

    * OC中的条件表达式非0即真, 而Swift中不行

    * Swift中提供了真正的Bool类型, true/false, 条件表达式的值必须是true/false

    */

    let num = 10

    if (num == 10)

    {

    print("number等于10")

    }

    if num == 10

    {

    print("number等于10")

    }

    /*:

    Switch

    * switch后面的圆括号可以省略

    * 如果是在OC中每个case后面不写break, 导致穿透. 而在Swift中不会

    * 如果是在OC中想在case后面定义变量, 必须加上{}说明作用域, 而在Swift中不用说明作用域

    * 如果是在OC中default的位置可以随便写, 而在Swift中不允许

    * 如果是在OC中default可以不用写, 而在Swift中大部分情况下是必须写的

    */

    let value = 3

    switch value

    {

    case 0:

    print("0")

    var i = 10

    case 1:

    print("1")

    case 2:

    print("2")

    case 3:

    print("3")

    case 4:

    print("4")

    default:

    print("other")

    }

    1.1 分支相关:

    /*:

    三目运算符

    * 格式: 条件表达式 ? 取值1 : 取值2

    * 注意: 运算符之间需要有空格

    * 提醒: 在Swift开发中三目运算符用得非常多

    */

    let num = 7

    let res = (num == 10) ? 10 : 5

    /*:

    可选类型(Optional)

    只要看到数据类型后面有 ? !

    * 含义: 可以有值也可以没有值, 只有可选类型的变量才能赋值nil

    * convenience init? 返回一个可选类型的值

    * 注意: 如果输出可选类型的值, 会包装一个Optional

    * 如果在变量的后面加上一个!, 代表告诉系统该变量一定有值

    * !称之为强制解包

    * 注意: 如果可选类型的变量中没有值, 而又进行了强制解包, 那么会引发一个运行时的错误

    * 开发技巧: 作为初学者, 不要去纠结? ! ??这些符号, 初期利用Xcode开发工具提醒来解决这些问题, 后期再深入研究什么时候使用? 什么时候使用!

    */

    let url = NSURL(string: "http://www.baidu.com")

    print(url!)

    let url2 = NSURL(string: "http://news.baidu.com")

    //print(url2!)

    if url != nil

    {

    print(url!)

    }

    /*

    自动解包

    * 如果数据类型后面写的是!, 那么在使用该变量时系统会自动给我们解包

    */

    let url4: NSURL! = NSURL(string: "http://www.baidu.com")

    print(url4)

    // 注意点: 数据类型后面不要随意添加!, 因为如果没有值会报错

    let url5: NSURL! = NSURL(string: "http://news.baidu.com")

    //print(url5)

    /*:

    可选绑定

    * 格式: if let 变量名称 = 可选类型变量 {}

    * 优点: 只要能进入大括号, 那么可选类型变量就一定有值

    */

    if let url3 = url

    {

    // 在if中不用对url3进行强制解包, 因为在赋值的过程中系统已经帮我们解包了

    print(url3)

    }

    1.2 循环相关:

    /*:

    Swift中的循环和OC中的循环 "基本"一致

    for

    while

    do while  -- > Swift是 repeat while

    */

    //: 常规写法

    // 其它特点和if一样

    for var i = 0; i < 10; i++

    {

    print(i)

    }

    //: Swift中的写法

    // 后面的 0..<10 称之为半壁区间

    // 半闭区间特点: 包含头不包含尾

    for i in 0..<10

    {

    print(i)

    }

    // 闭区间: 包含头包含尾

    // 注意点: .../..< 中间不能有空格

    for i in 0...10

    {

    print(i)

    }

    // while: Swift开发中很少使用while

    var index = 0

    while index < 10

    {

    print(index)

    index++

    }

    // repeat while

    var i = 0

    repeat{

    print(i)

    i++

    }while(i < 10)

    1.3 数组相关:

    /*:

    数组

    * 格式: []

    * 注意点: let 不可变数组 var 可变数组

    */

    let arr1 = ["10", "20", "30"]

    // 特点: 自动将基本数据类型转换为对象类型

    var arr2 = [10, "20", 99.9]

    // 获取

    print(arr2[1])

    // 修改

    arr2[2] = 100

    arr2

    // 追加

    arr2.append(33)

    // 删除, 数组的删除方法会将被删除的元素返回给我们

    arr2.removeAtIndex(0)

    arr2

    // keepCapacity: 删除数组中的元素, 是否需要保持数组原有的容量, 如果传入false代表不保持容量

    arr2.removeAll(keepCapacity: false)

    arr2.capacity

    // 注意点: 数组添加容量永远是在原有容量的基础上*2

    arr2.append(1)

    arr2.capacity

    arr2.append(2)

    arr2.capacity

    arr2.append(3)

    arr2.capacity

    // 合并

    var arr3 = [1, 3, 5]

    var arr4 = [2, 4, 6]

    arr3 += arr4

    arr3

    //var arr5 = ["8", "9"]

    //arr3 += arr5

    for item in arr3

    {

    print(item)

    }

    1.4 字典:

    /*

    字典

    * OC @{key:value}

    * Swift [key:value]

    * 和数组一样, 如果用let修饰就是不可变字典, 如果用var修饰就是可变字典

    */

    // 开发技巧: 在iOS开发中使用频率最高的就是 [String: AnyObject]

    let dict1 = ["name": "stone", "age": 3]

    var dict2:[String: AnyObject]

    dict2 = ["name": "stone", "age": 3]

    // 获取

    // 注意点: 从字典中取出的值都是可选类型的值

    // 因为通过一个key取值, 可能取得到, 也可能取不到, 所以返回一个可选类型的值

    // 如果!写在[]后面, 代表取出来的值一定有值

    // 如果!写在dict后面, 代表dict一定有值

    print(dict2["name"]!)

    // 更新

    dict2["name"] = "stone"

    dict2

    // 添加

    // 也就是说, 如果key存在就是更新, 如果key不存在就是添加

    dict2["score"] = 99

    dict2

    // 遍历

    for key in dict2.keys

    {

    print(dict2[key])

    }

    // 会将字典中的key赋值给()中的第一个变量

    // 会将字典中的value赋值给()中的第二个变量

    // 注意: k/v随便写

    // ()括起来的东西我们称之为元祖, 元祖是Swift中新增的一种数据类型

    for (xx, oo) in dict2

    {

    print(xx)

    print(oo)

    }

    // 合并

    var dict3:[String: AnyObject] = ["name": "stone", "age": 3]

    var dict4:[String: AnyObject] = ["score": 99]

    // 字典不能像数组一样通过+=来合并

    //dict3 += dict4

    for (k, v) in dict3

    {

    dict4[k] = v

    }

    dict4

    1.5 字符串相关:

    import UIKit

    /*:

    字符串

    * OC: @""

    * Swift: ""

    * 特点:

    1.OC中的字符串是一个对象, Swift中的字符串是一个结构体

    2.Swift中的字符串的性能比OC中的高

    3.虽然OC中的字符串是一个对象, 而Swift中的字符串是一个结构体, 但是在Swift开发中可以在这两个数据类型之间快速的进行转换

    */

    var str = "stone"

    for c in str.characters

    {

    print(c)

    }

    // 字符串的拼接

    let name = "stone"

    let gender = "man"

    // 目标: name = stone, gender = man

    //NSLog(@"name = %@, gender = %@", name, gender)

    // 注意: Swift的print函数不支持%i/%@等占位符

    //print("name = %@, gender = %@", name, gender)

    // Swift中拼接内容使用 \(需要拼接的数据)

    print("name = \(name), gender = \(gender)")

    // 10.987654321  --> 10.98

    let dValue = 10.987654321

    let res = String(format: "%.2f", arguments: [dValue])

    print(res)

    // 15-09-07

    let res2 = String(format: "%02d-%02d-%02d", arguments: [15, 9, 7])

    print(res2)

    // 字符串截取

    // 在Swift开发中字符串截取是一件非常非常非常蛋疼的问题

    // 建议: 在Swift开发中如果要截取字符串, 或者以前在OC中使用的方法在Swift字符串中没有, 建议先将Swift字符串转换为OC字符串之后再使用

    let str2 = "stoneleon"

    //let str3 = str2 as NSString

    //let str3: NSString = str2

    let str4 = (str2 as NSString).substringWithRange(NSMakeRange(0, 4))

    print(str4)

    let str5:NSString = "user/desktop/abc.txt"

    str5.pathExtension

    1.6 函数相关:

    /*:

    函数:

    * 格式 func 函数名称(参数列表) -> 返回值类型 {}

    */

    // 没有返回值没有参数的

    func say() -> Void

    {

    print("hello")

    }

    say()

    // 如果没有返回值还可以简写

    // Void == ()

    func say2() -> ()

    {

    print("world")

    }

    say2()

    // 如果没有返回值, 那么返回值类型可以省略

    func say3()

    {

    print("stone")

    }

    say3()

    // 有返回值没有参数的

    // 注意点: 返回值类型必须和返回的值保持一致

    func getMax() ->Int

    {

    return 998

    }

    print(getMax())

    // 没有返回值有参数的

    // - (void)sum:(int)a b:(int)b;

    // [self sum:10 b: 20];

    // 从Swift2.0开始, 会自动将第二个参数开始的参数名称作为方法的标签

    func sum(a: Int, b: Int)

    {

    print("sum = \(a + b)")

    }

    sum(10, b: 20)

    // 单独指定方法的标签(提高阅读性)

    // 可以在内部参数的前面加上外部参数名称

    // 内部参数: a/b , 给函数内部使用的

    // 外部参数: x/y , 给调用者使用的

    func sum2(x a: Int, y b: Int)

    {

    print("sum = \(a + b)")

    }

    sum2(x: 30, y: 30)

    // Swift2.0之前

    // 代表a/b既是内部参数也是外部参数

    //func sum(#a: Int, #b: Int)

    //{

    //    print("sum = \(a + b)")

    //}

    //sum2(a: 30, b: 30)

    // 默认值

    // 如果指定了默认值, 那么调用的时候可以忽略, 如果忽略会使用默认值

    // 在其它语言中其实早就有默认值的概念了, 在其它语言中的默认值只能写在形参列表的最后面

    // 但是Swift中的默认值可以写在任意地方

    func sum3(a: Int, b: Int = 110)

    {

    print("sum = \(a  + b)")

    }

    //sum3(50, b: 10)

    sum3(50)

    func sum4(a: Int = 88, b: Int = 100)

    {

    print("sum = \(a  + b)")

    }

    //sum4(b: 88)

    sum4()

    // 有返回值有参数的

    func sum5(a: Int, b: Int) -> Int

    {

    return a + b

    }

    print(sum5(20, b: 20))

    未完待续...

    相关文章

      网友评论

        本文标题:Swift简介(二)

        本文链接:https://www.haomeiwen.com/subject/mzkshttx.html