美文网首页
Swift 语法(一)

Swift 语法(一)

作者: 对歌当酒 | 来源:发表于2016-07-14 10:48 被阅读34次

    基本类型

    • 变量和常量

    使用 var 来声明变量,使用 let 来声明常量,示例代码:

    var myVariable = 42
    myVariable = 50
    
    let myConstant = "Hello"
    

    PS: 常量或变量的类型必须和你赋给它们的值一样。但不必明确地声明类型,声明的同时赋值的话,编译器会自动推断类型。

    也可以显式声明变量,如下所示:

    let url:String = "www.abc.com" //显式声明 url 为 String 类型
    var a, b, c : Double //显式声明 a, b, c 均为 Double 类型
    
    • 各种进制表示
    let decimalInt:Int = 17 //十进制
    let binaryInt:Int = 0b10001 //二进制
    let octalInt:Int = 0o21 //八进制
    let hexInt:Int = 0x11 //十六进制
    
    • 布尔型
    let imTrue:Bool = false;
    if imTrue { //条件语句,不加括号。非0整型不能解读为布尔类型
        print("I'm true")
    }
    else {
        print("I'm false")
    }
    
    if 1+1==2 { //OK
        print("1 + 1 = 2")
    }
    
    • 浮点型
    let floatNum:Float = 3.1415926 //Float 精度为小数点后6位,因此实际结果为 3.141593
    let doubleNum:Double = 3.1415926
    
    //PS: 默认为 Double 类型
    
    • Character
    //Character 可以表示汉字或表情(若不显式定义为 `Character` 类型,则为 `String` 类型)
    let enLetter:Character = "a"
    let cnLetter:Character = "你"
    let dog:Character = "🐶"
    let cool:Character = "\u{1F60E}"
    
    • 元组

    元组:将多个不同的值集合成一个数据。
    特点:可以有多个值;不同的值可以是不同类型。
    示例代码:

    //定义
    var point = (1, 3)
    var httpResponse = (404, "Not Found")
    
    //显式定义,限定类型
    var point2:(Int, Int, Int) = (1, 2, 4)
    var httpResponse2:(Int, String) = (200, "OK")
    
    //可以给变量命名,这样解包时可通过名字访问
    var point3 = (x:1, y:2, z:4)
    var point4:(x:Int, y:Int, z:Int) = (1, 2, 4)
    
    //解包(即获取元组里的元素)
    let (xx, yy) = point
    httpResponse.0
    httpResponse.1
    
    //命名后即可用名字访问
    point3.x
    point4.y
    
    //可用下划线 _ 表示对该变量不关心
    let loginInfo = (true, "user")
    let (isSuccess, _) = loginInfo
    
    • 其他
    //以科学计数法形式定义
    var d = 1.2e5 //1.2*10^5
    var e = 1.2e-5 //1.2*10^-5
    
    //可用下划线 _ 分隔大数,便于区分。例如定义一百万
    let bigNum = 1_000_000
    

    此外,变量还可以命名为汉字(或其他 Unicode8 编码的字符)或表情符号,例如:

    var 名字 = "Ace"
    var 😀 = "smile"
    
    print(名字, 😀)
    print(名字, 😀, separator:" - ") //自定义 print 分隔符(默认是空格)
    print(名字, 😀, separator:"--", terminator:", end") //自定义结束符(默认是回车 \n)
    // 注意:单词不要拼错了
    

    还可以在 print 中使用 \() 方便的显示变量,例如:

    let i=2, j=3, k=5
    print("\(i) * \(j) * \(k) = \(i*j*k)") //打印结果:2 * 3 * 5 = 30\n
    

    运算符

    • 算数运算符
    let x1:UInt8 = 12
    let x2:UInt16 = 21
    
    //二者必须强制转换为相同类型才能进行运算
    let m = UInt16(x1) + x2 //注意强转的写法
    let n = x1 + UInt8(x2)
    

    逻辑控制语句

    • for

    for..in 循环示例代码:

    for index in 1...5 { //... 前后都是闭区间
        index
    //    index = 3 //error, 这里的 index 是常量
    }
    
    for index in 1..<5 { //..< 前闭后开区间
        index
    }
    

    若不关心循环到了多少次,可以这么写:

    var result = 1
    var base = 2
    for _ in 1...10 { //忽略第几次
        result *= base
    }
    

    此外,有时为了跳出多个循环嵌套,可以给循环命名,例如:

    // 跳出指定的循环,给循环命名
    findAnswer:
    for m in 1...300 { //
        for n in 1...300 {
            if m*m*m*m - n*n == 15*m*n {
                print(m, n)
                break findAnswer //结束循环过程
            }
        }
    }
    
    • while

    while 循环:

    var i = 0
    while i < 3 {
        print(i)
        i++
    }
    

    repeat..while 循环(相当于 do..while):

    var j = 0
    repeat {
        j++
        print(j)
    } while j < 3
    
    • switch

    C, Java 等语言相比,Swift 语言的 switch 语句有许多变化。

    var rating = "a"
    switch rating {
    case "A", "a": //判断多种不同的值
        print("great")
    case "B":
        print("so-so")
    case "C":
        print("bad")
    default : //switch 必须穷举所有情况
        print("error")
    }
    

    注意: case 语句后无需 break, 执行一个 case 后自动跳出。

    case 后可以是布尔类型或浮点型等,例如:

    let b = true
    switch b {
    case true:
        print("true")
    default:
    //    print("false")
    //    break
        () //若无任何操作,可用 break 或 () 来结束
    }
    

    switch 高级用法,switch 后还可以是一个区间,例如:

    let score = 89
    switch score {
    case 0:
        print("you got an egg")
    case 1..<60: //判断区间
        print("you failed")
    case 60..<80:
        print("good")
    case 80..<90:
        print("nice")
    case 90..<100:
        print("great")
    case 100:
        print("perfect")
    default:
        print("error")
    }
    

    switch 还可以配合元组使用,例如:

    let point = (1, 1)
    switch point {
    case (0, 0):
        print("0, 0")
    case (_, 0): //忽略一些内容
        print("x-axis")
    case (0, _):
        print("y-axis")
    case (-2...2, -2...2): //可以使范围
        print("near the origin")
    default:
        print("youa are crazy")
    }
    

    配合关键字 fallthough 使用:

    let point2 = (0, 0)
    switch point2 {
    case (0, 0):
        print("origin")
        fallthrough //穿透 case,但下层 case 中不能声明变量
    case (_, 0):
        print("x-axis")
        print("value of x is \(x)")
    case (0, let y):
        print("y-axis")
        print("value of y is \(y)")
    case (let x, let y):
        print("the point is (\(x), \(y))")
    }
    

    配合关键字 where 使用:

    let point3 = (2, 2)
    switch point3 {
    case (let x, let y) where x == y: //where 又增加了限制条件
        print("It's on the line x=y")
    case let (x, y) where x == -y:
        print("It's on the line x=-y")
    case let (x, y):
        print("the point is (\(x), \(y))")
    }
    

    此外,case...where 也可以用在 if 语句中,例如:

    let age = 19
    switch age {
    case 10...19:
        print("you're a teenager")
    default:
        print("you are not")
    }
    
    if case 10...19 = age {
        print("you're a teenager")
    }
    
    if case 10...19 = age where age >= 18 {
        print("you're a teenager")
    }
    
    • guard 关键字

    这是 Swift 中的新特性,示例代码:

    //一般函数 (func 是定义函数的关键字)
    func buy(money:Int, price:Int, capacity:Int, volume:Int) {
        if money >= price {
            if capacity >= volume {
                print("I can buy it!")
                print("¥\(money-price) left")
                print("\(capacity-volume) cubic meters left")
            }
            else {
                print("No enough capacity")
            }
        }
        else {
            print("No enough money")
        }
    }
    
    //使用 guard 关键字后的函数(与前者等效)
    func buy2(money:Int, price:Int, capacity:Int, volume:Int) {
        guard money >= price else {
            print("No enough money")
            return
        }
        
        guard capacity >= volume else {
            print("No enough capacity")
            return
        }
        
        print("I can buy it!")
        print("¥\(money-price) left")
        print("\(capacity-volume) cubic meters left")
    }
    
    buy(20, price: 12, capacity: 80, volume: 60)
    buy2(20, price: 12, capacity: 80, volume: 60)
    

    使用 guard 关键字可以把核心逻辑不相关的分隔开,使程序条理更清晰。还有其他用法,以后再总结。

    字符串

    • 声明
    //声明字符串
    var str = "Hello, playground"
    var str:String = "Hello, playground" //显式声明
    var str = String("Hello, playground")
    
    //声明空的字符串
    var emptyString = ""
    var emptyStr = String()
    var emptyStr = String("")
    
    • 字符串连接
    var mark = "!!!"
    str + mark //不改变 str 的值
    str += mark //改变 str 的值
    
    • 遍历
    //遍历字符串中的每一个字符
    for c in str.characters {
        print(c)
    }
    
    • 索引
    var str = "Hello, Swift"
    
    str.characters.count //字符串长度, 12
    
    var startIndex = str.startIndex //首位字符索引, 0. (闭区间, 即包含该索引位)
    str[startIndex] //获取首位字符, 即 "H"
    str[startIndex.successor()] //获取后一位对应的字符, 即 "e"
    str[startIndex.advancedBy(2)] //距离,类似偏移量, 即 "l"
    
    str.endIndex //末位字符索引, 12. (开区间, 不包含该索引位)
    str[endIndex.predecessor()] //获取末位字符, 即 "t"
    str[endIndex] //error, 这样是错误的,越界了
    

    注意:索引是前闭后开的,即 [startIndex, endIndex)

    增删字符:

    //添加字符到指定位置
    str.insert("?", atIndex: endIndex)
    
    //移除最后一个字符
    str.removeAtIndex(endIndex.predecessor())
    
    • 区间
    //Range<Index> 类型,可以移除字符串中的一个子字符串
    var range = startIndex..<endIndex
    
    //移除某个区间内的字符串 (PS: 这里全部移除了)
    str.removeRange(startIndex..<endIndex)
    
    • 常用方法
    str.isEmpty //判空
    str.characters.count //字符串的长度(解析字符串长度时,一个汉字或一个表情都算一个长度)
    str.uppercaseString //转大写
    str.lowercaseString
    str.capitalizedString //首字母大写
    str.containsString("af") //是否包含某字符串
    str.hasPrefix("ca") //判断前缀
    str.hasSuffix("end") //判断后缀
    
    str.append(mark2) //字符串后添加一个字符(Character),会改变 str 变量
    str + String(mark2)
    
    str.appendContentsOf("---") //添加字符串
    
    • 转义符

    常见的如下:

    var s = "\"" //双引号 "
    var t = "\t" //制表符
    var n = "\n" //换行符
    
    • 其他

    根据需要保留相应的小数位数:

    let s0 = "one third is \(1.0/3.0)" //0.333333333333333
    var s1 = String(format: "one third is %.2f", 1.0/3.0) //0.33
    

    格式化字符串:

    let s2 = " -- hello --- " as NSString //转为NSString类型
    
    //去除空格和下划线
    s3.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: " -"))
    

    总结自 玩儿转Swift 2.0(第一季)

    相关文章

      网友评论

          本文标题:Swift 语法(一)

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