Swift基本语法

常量和变量

  • let 常量,只有一次赋值机会,不能够被修改
  • var 变量,可以被修改
  • swift会自动推导数据类型
    • 整数的默认类型是int
    • 小数的默认类型是Double
  • 不同类型之间不能够直接计算,OC可以,因为有隐式转换
    • 类型转换:调用构造函数转换类型
  • Swift要求运算符对称
  • let 和 var 的选择
    • 选择let更加的安全

可选类型

一个对象有两面性:有值或者为nil
  • 声明

    • 在类型的后面添加'?'声明可选类型 例:var a:Int?
    • 常量的可选类型是没有意义的,因为只有一次赋值机会
    • 必选类型,一定要有值,并且一定不能为nil
  • 可选类型计算

    • 可选类型不能够直接参与计算
  • '?'

    • 表示可选类型
    • 在打印的时候会自动带上Optional字样
  • '!'

    • 可选类型不能够直接计算,如果参与计算系统会自动提示添加'!'强制解包
    • 将'可选类型'的值,解包
    • 报错fatal(致命的) error: unexpectedly found nil while unwrapping() an Optional value
    • '!'存在风险,如果为nil,程序就会boom
    • 提示程序员在这个地方可能存在风险需要考虑是否需要判断为nil
  • '??'

    • 空合并运算符得到的结果是必选类型
    • 运算符的优先级比较低,在使用的时候需要使用()来提高优先级
    • 相当于三目运算符
    • 快速判断对象是够为nil,如果为nil,就去??后面设置的默认值
  • 带有红圈白点的错误提示,一般都是系统能够自动修改的错误

if判断

  • 特点
    • 添加判断,不需要()可以添加
    • 执行分支必须有{}
    • Swift没有非零即真的概念,只有true和false
  • 三目运算
    • 和OC没有任何区别
  • guard(守护)
    • 作用和if!()类似,给判断条件取反
  • if let/var
    • 快速给一个对象赋值并且判断是否为nil
    • 如果对象不为nil,就进入分支执行
    • 在分支中可以直接使用必选类型的对象,更加方便,不需要每次都强制解包
  • guard let/var ...else
    • 快速给一个对象赋值并且判断是否为nil
    • 如果对象不为nil,就进入else分支执行
    • 在分支中可以直接使用必选类型的对象,更加方便,不需要每次都强制
  • switch..case
    • 判断任意类型的对象
    • 不需要写break,默认不穿透,如果需要穿透需要添加fallthrouth关键字
    • 定义临时变量不需要添加{}限制作用域
    • 一次性可以判断多个值

可选类型判断总结

  • ?? 空合并运算符,适用于判断,基本数据类型字符串
  • if let/var
  • guard let/var ..else

循环

  • 和C的不同
    • ++ 语法废弃,改为+=
    • c风格的循环被废弃
  • for in
    • 0..<9 范围 0 - 8
    • 0...9 范围 0 - 9
  • '_'
    • 编译忽略

字符串

  • 特点

    • String字符串类型,通过结构体实现的,更加轻量级,支持快速遍历,NSString中的并不支持,String可以和NSString无缝的转换
    • NSString继承NSObiect是一个对象,不支持遍历
  • 声明

    • var str:String = "Hello World"
  • 长度的计算

    let str: String = "听说爱笑的人运气都不会太差哟!"
    let len = str.lengthOfBytes(using: .utf8)
    print(len)
    let length = str.characters.count
    print(length)
    
    • 遍历
    let str: String = "听说爱笑的人运气都不会太差哟"
    
    for s in str.characters {
        print(s)
    }
    
    • 合并,转换,格式化
    let str1 = "你若安好"
    let str2 = "便是晴天"
    let str = str1 + str2
    print(str)
    let name = "蛋蛋"
    let age = 18
    //调用构造函数通过传入数字得到字符串
    let des1 = name + String(age)
    
    //"\()" 将对象转义为字符串
    let des2 = name + "\(age)"
    print(des2)
    
    //字符串的格式化
    // 09:10:02
    let h = 9
    let m = 10
    let s = 2
    let time = String(format: "%02d:%02d:%02d", h,m,s)
    print(time)
    

数组

  • 格式

    • 使用[]定义数组
    • [String]是一个泛型数组只能够存放字符串对象
  • 空数组

    • String
  • 可变or不可变

    • let 声明的是不可变的数组
    • var 是可变的数组
  • 增/删/改/遍历

     var array = ["张三","姜丝"]
    //增 
    array.append("外婆")
    array.insert("杰克", at: 0)
    
    //改
    array[0] = "肉丝"
    //删
    //array.remove(at: 0)
    //array.removeFirst()
    //print(array)
    //array.removeLast(2)
    //遍历
    for name in array {
        print(name)
    }
    
    for index in 0..<array.count {
        let name = array[index]
        print(name)
    }
    
    //遍历角标和元素
    print("------------------------")
    for (offset,value) in array.enumerated() {
        print(offset,value)
    }
    //倒序遍历
    for name in array.reversed() {
        print(name)
    }
    
    

字典

  • 格式

    • 使用[:]定义字典
    • [String : String]是一个泛型字典类型
  • 空数组

  • 可变or不可变

    • let 不可变的字典
    • var 可变的字典
  • 增/删/改/遍历

    	 var dict = ["name" : "磊哥", "age" : "18"]
        dict["des"] = "每天都被自己帅醒"
        print(dict)
        dict.removeValue(forKey: "des")
        print(dict)
        //遍历
        for (key,value) in dict {
            print(key,value)
        }
    
        //合并
        let dict1 = ["title" : "帅哥"]
        for (key,value) in dict1 {
            dict[key] = value
        }
        print(dict)
    
posted @ 2017-03-23 19:40  zero的小纸条  阅读(237)  评论(0编辑  收藏  举报