美文网首页
Swift基础部分(复习)

Swift基础部分(复习)

作者: 小驴拉磨 | 来源:发表于2018-05-22 15:24 被阅读6次

    一、常量和变量

    Swift中用 let 来声明常量,用 var 来声明变量。

        //声明一个名字为number常量
        let number = 333
        //声明一个名字为mutableNumber变量
        var mutableNumber = 444
        //这一行声明了三个变量,分别是x,y,z
        var x = 0.0, y = 0.0, z = 0.0
    

    二、类型标注

    当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。

        //声明一个名字为mutableArray变量,里面的元素必须是int类型
        var mutableArray: [Int]?
        //表示这个变量可以存储 String 类型的值
        var welcomeMessgae: String
    

    注意:
    一般来说你很少需要写类型标注。如果你在声明常量或者变量的时候赋了一个初始值,Swift可以推断出这个常量或者变量的类型

    三、整数

    整数就是没有小数部分的数字,Swift 提供了8,16,32和64位的有符号和无符号整数类型。这些整数类型和 C 语言的命名方式很像,比如8位无符号整数类型是UInt8,32位有符号整数类型是 Int32 。就像 Swift 的其他类型一样,整数类型采用大写命名法。

    • 整数范围
      你可以访问不同整数类型的 min 和 max 属性来获取对应类型的最小值和最大值:
    let minValue = UInt8.min  // minValue 为 0,是 UInt8 类型
    let maxValue = UInt8.max  // maxValue 为 255,是 UInt8 类型
    

    min 和 max 所传回值的类型,正是其所对的整数类型(如上例UInt8, 所传回的类型是UInt8),可用在表达式中相同类型值旁。

    • Int
      在32位平台上,Int 和 Int32 长度相同。
      在64位平台上,Int 和 Int64 长度相同。
      除非你需要特定长度的整数,一般来说使用 Int 就够了
    • UInt
      Swift 也提供了一个特殊的无符号类型 UInt,长度与当前平台的原生字长相同:
      在32位平台上,UInt 和 UInt32 长度相同。
      在64位平台上,UInt 和 UInt64 长度相同。
      注意:
      尽量不要使用UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使你要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断。

    四、浮点数

    • Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
    • Float表示32位浮点数。精度要求不高的话可以使用此类型。
      注意:
      Double精确度很高,至少有15位数字,而Float只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围,在两种类型都匹配的情况下,将优先选择 Double。

    五、数值类型转换

    SomeType(ofInitialValue) 是调用 Swift 构造器并传入一个初始值的默认方法。

    //整数转换
    let twoThousand: UInt16 = 2_000
    let one: UInt8 = 1
    let twoThousandAndOne = twoThousand + UInt16(one)
    //整数和浮点数转换
    let three = 3
    let pointOneFourOneFiveNine = 0.14159
    let pi = Double(three) + pointOneFourOneFiveNine
    // pi 等于 3.14159,所以被推测为 Double 类型
    

    六、类型安全和类型推断

    • Swift是一个类型安全(type safe)的语言,让你清楚地知道代码要处理的值的类型,如果你的代码需要一个String,你绝对不可能不小心传进去一个Int,因为它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
    • Swift还会帮我们做类型推断,每次声明常量和变量的时候都不必显式指定类型,如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型,编译器会根据你赋的值自动推断出表达式的类型。
    let number = 42
    // number 会被推测为 Int 类型
    let number = 3.14159
    // number 会被推测为 Double 类型
    let number = 3 + 0.14159
    // number 会被推测为 Double 类型
    

    七、布尔值

    Swift 有一个基本的布尔(Boolean)类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true 和 false:

    八、元组

    元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。
    你可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型。只要你想,你可以创建一个类型为 (Int, Int, Int) 或者 (String, Bool) 或者其他任何你想要的组合的元组。

    let http404Error = (404, "Not Found")
    // http404Error 的类型是 (Int, String),值是 (404, "Not Found")
    
    let (statusCode, statusMessage) = http404Error
    print("The status code is \(statusCode)")
    // 输出 "The status code is 404"
    print("The status message is \(statusMessage)")
    // 输出 "The status message is Not Found"
    
    //如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
    let (justTheStatusCode, _) = http404Error
    print("The status code is \(justTheStatusCode)")
    // 输出 "The status code is 404"
    
    //你可以在定义元组的时候给单个元素命名:
    
    let http200Status = (statusCode: 200, description: "OK")
    //给元组中的元素命名后,你可以通过名字来获取这些元素的值:
    
    print("The status code is \(http200Status.statusCode)")
    // 输出 "The status code is 200"
    print("The status message is \(http200Status.description)")
    // 输出 "The status message is OK"
    

    注意:
    元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。

    九、可选类型

    使用可选类型(optionals)来处理值可能缺失的情况。C 和 Objective-C 中并没有可选类型这个概念。可选类型表示:

    • 有值,等于 x
      或者
    • 没有值,为nil
      例如:Swift 的 Int 类型有一种构造器,作用是将一个 String 值转换成一个 Int 值。然而,并不是所有的字符串都可以转换成一个整数。字符串 "123" 可以被转换成数字 123 ,但是字符串 "hello, world" 不行。
    let possibleNumber = "123"
    let convertedNumber = Int(possibleNumber)
    // convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
    //因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个 Int。一个可选的 Int 被写作  Int? 而不是 Int。问号暗示包含的值是可选类型,也就是说可能包含 Int 值也可能不包含值。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都没有。)
    

    十、nil

    你可以给可选变量赋值为nil来表示它没有值:

    var serverResponseCode: Int? = 404
    // serverResponseCode 包含一个可选的 Int 值 404
    serverResponseCode = nil
    // serverResponseCode 现在不包含值
    
    var surveyAnswer: String?
    // surveyAnswer 被自动设置为 nil
    

    注意:
    nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
    Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。

    十一、强制解析

    • 方式一
      当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)。
      注意:
      使用 ! 来获取一个不存在的可选值会导致运行时错误。使用 ! 来强制解析值之前,一定要确定可选包含一个非 nil 的值。
    • 方式二
      使用 if 语句中写一个可选绑定:
    if let constantName = someOptional {
        //如果someOptional有值会进来
    }
    

    你可以在可选绑定中使用常量和变量。如果你想在if语句的第一个分支中操作 actualNumber 的值,你可以改成 if var actualNumber,这样可选类型包含的值就会被赋给一个变量而非常量。
    你可以包含多个可选绑定或多个布尔条件在一个 if 语句中,只要使用逗号分开就行。只要有任意一个可选绑定的值为nil,或者任意一个布尔条件为false,则整个if条件判断为false,这时你就需要使用嵌套 if 条件语句来处理,如下所示:

    if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
        print("\(firstNumber) < \(secondNumber) < 100")
    }
    // 输出 "4 < 42 < 100"
    
    if let firstNumber = Int("4") {
        if let secondNumber = Int("42") {
            if firstNumber < secondNumber && secondNumber < 100 {
                print("\(firstNumber) < \(secondNumber) < 100")
            }
        }
    }
    // 输出 "4 < 42 < 100"
    

    注意: 在 if 条件语句中使用常量和变量来创建一个可选绑定,仅在 if 语句的句中(body)中才能获取到值。相反,在 guard 语句中使用常量和变量来创建一个可选绑定,仅在 guard 语句外且在语句后才能获取到值.

    guard let name = person["name"] else {
            return
        }
    

    十二、错误处理

    你可以使用 错误处理(error handling) 来应对程序执行中可能会遇到的错误条件。

    //当一个函数遇到错误条件,它能报错。调用函数的地方能抛出错误消息并合理处理。
    func canThrowAnError() throws {
        // 这个函数有可能抛出错误
    }
    

    一个函数可以通过在声明中添加throws关键词来抛出错误消息。当你的函数能抛出错误消息时, 你应该在表达式中前置try关键词。

    do {
        try canThrowAnError()
        // 没有错误消息抛出
    } catch {
        // 有一个错误消息抛出
    }
    

    十三、断言和先决条件

    • 使用断言进行调试
      你可以调用 Swift 标准库的 assert(::file:line:) 函数来写一个断言。向这个函数传入一个结果为 true 或者 false 的表达式以及一条信息,当表达式的结果为 false 的时候这条信息会被显示:
    let age = -3
    assert(age >= 0, "A person's age cannot be less than zero")
    // 因为 age < 0,所以断言会触发
    //如果不需要断言信息,后面的可以去掉
    

    如果代码已经检查了条件,你可以使用 assertionFailure(_:file:line:)函数来表明断言失败了,例如:

    if age > 10 {
        print("You can ride the roller-coaster or the ferris wheel.")
    } else if age > 0 {
        print("You can ride the ferris wheel.")
    } else {
        assertionFailure("A person's age can't be less than zero.")
    }
    
    • 强制执行先决条件
      当一个条件可能为false(假),但是继续执行代码要求条件必须为true(真)的时候,需要使用先决条件。例如使用先决条件来检查是否下标越界,或者来检查是否将一个正确的参数传给函数。

    你可以使用全局 precondition(::file:line:) 函数来写一个先决条件。向这个函数传入一个结果为 true 或者 false 的表达式以及一条信息,当表达式的结果为 false 的时候这条信息会被显示:

    // 在一个下标的实现里...
    precondition(index > 0, "Index must be greater than zero.")
    

    你可以调用 precondition(::file:line:)方法来表明出现了一个错误,例如,switch 进入了 default 分支,但是所有的有效值应该被任意一个其他分支(非 default 分支)处理。

    原文出自51Swift转载请保留原文链接

    相关文章

      网友评论

          本文标题:Swift基础部分(复习)

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