swift 基础语法二 (元组、可选类型)

这是我参与更文挑战的第2天,活动详情查看: 更文挑战markdown

元组(tuples)

元组把多个值组合成一个复合值。元组内的值能够是任意类型,并不要求是相同类型。数据结构

eg: (Int,String)(Int,Int,Bool)等等app

  • 元组的定义
    • 定义元组时,能够在元组中命名各个元素
    let http404Error = (statusCode: 404, description: "Not Found")
    复制代码
    • 也能够直接定义
    let http404Error = (404,"Not Found")
    复制代码
  • 元组的访问
    • 能够将元组的内容分解为单独的常量或变量
    let http404Error = (404,"Not Found")
    let (statusCode,statusMessage) = http404Error;
    print(statusCode)     //404
    print(statusMessage)  //Not Found
    复制代码
    • 若是你只须要一部分元组值,分解的时候能够把要忽略的部分用下划线(_)标记
    let http404Error = (404,"Not Found")
    let (statusCode, _) = http404Error
    print("The status code is \(statusCode)")  //The status code is 404
    复制代码
    • 经过下标来访问元组中的单个元素,下标从零开始
    let http404Error = (404,"Not Found")
    print("The status code is \(http404Error.0)")    //The status code is 404
    print("The status message is \(http404Error.1)") //The status code is 404
    复制代码
    • 若是在元组中命名元素,则可使用元素名称来访问这些元素的值
      let http200Status = (statusCode: 200, description: "OK")
      print("The status code is \(http200Status.statusCode)")      // Prints "The status code is 200"
      print("The status message is \(http200Status.description)")  // Prints "The status message is OK"
      复制代码
    注意:
    元组在临时组合值的时候颇有用,可是并不适合建立复杂的数据结构。若是你的数据结构并非临时使用,请使用类或者结构体而不是元组

可选类型(optionals)

在 OC 中不存在可选项的概念,一个方法的返回值是一个对象,若是没有对象会返回 nil 。nil 只适用于对象,不适用与结构体和枚举。对于结构体和枚举,OC 一般用 NSNotFound 表示值的缺失。 而在 Swift 中,使用optionals 处理任何类型,判断它们是否有值post

optionals

  • 使用可选类型(optionals)来处理值可能缺失的状况
  • 可选的表明两种可能性
    • 有值
    • 没值
  • 一个可选的 XXX 被写做 XXX?,问号(?)暗示包含的值是可选类型,也就是说可能包含 XXX 值也可能不包含值
let strNum = "123"
let a = Int(strNum)
print(a) //Optional(123) //a 被推断为Int类型,或 optional Int 类型

let str = "b"
let b = Int(str)
print(b) //nil
复制代码

由于 Int 初始化可能会失败,因此它返回一个可选类型optional Int,而不是一个Int。也就是说可能包含 Int 值也可能不包含值。ui

nil

  • 给可选变量赋值为nil来表示它没有值
var value: Int? = 10  //value 包含一个可选的 Int 值 10
value = nil  // value 如今不包含值
复制代码
  • 声明一个可选常量或者变量可是没有赋值,它们会自动被设置为nil
var message: String?  //message 被自动设置为 nil
复制代码
  • nil不能用于非可选的常量和变量。若是你的代码中有常量或者变量须要处理值缺失的状况,请把它们声明成对应的可选类型
var a:String  = nil   //报错
let b: Int = nil      //报错

var a:String?  = nil  //正确 nil
let b: Int? = nil     //正确 nil
复制代码

if语句以及强制解析

可使用 if语句nil 比较来判断一个可选值是否包含值,使用==!= 来执行比较spa

  • 若是可选类型有值,它将不等于 nil
var code: Int? = 10
if code != nil {
   print("code是个整数") //code是个整数
}
复制代码
  • 当你肯定可选类型确实包含一个非nil的值以后,你能够在可选的名字后面加一个感叹号!来获取值。这个感叹号!表示“这个可选有值,可使用”。这被称为可选值的强制解析(forced unwrapping)
var code: Int? = 10
if code != nil {
    print("code 值为 \(code!)")code 值为 10
}
复制代码

可选绑定(optional binding)

使用可选绑定来判断可选类型是否包含值,若是包含就把值赋给一个临时常量或者变量,可选绑定能够与ifwhile语句一块儿使用,以检查可选中的值,并将该值提取到常量或变量中,做为单个操做的一部分code

  • if语句为例,进行可选绑定
let strNum = "123"
if let actualNum = Int(strNum) {
    print("字符串 \"\(strNum)\"转为数字为 \(actualNum)")
} else {
    print("字符串 \"\(strNum)\" 不能被转为数字")
}

//字符串 "123"转为数字为 123
复制代码

若是Int初始化返回的可选Int(strNum)值包含一个值,则赋值给一个新常量 actualNum并执行if语句的第一个分支orm

  • 单个if语句中能够包含任意数量的可选绑定和布尔条件,它们之间须要用逗号,隔开,若是可选绑定中有nil或布尔条件计算结果为false,则整个if语句的条件被视为false
if let firstNumber = Int("2"), let secondNumber = Int("8"), firstNumber < secondNumber && secondNumber < 10 {
    print("\(firstNumber) < \(secondNumber) < 10")
}else{
    print("其余处理")
}

// 2 < 8 < 10
复制代码

隐式解析可选类型(implicitly unwrapped optionals)

有时候在代码逻辑中,第一次被赋值以后,能够肯定一个可选类型总会有值。这种类型的可选状态被定义为隐式解析可选类型,Swift中隐式解析可选类型主要用在类初始化。对象

把想要用做可选的类型的后面的问号?改为感叹号!来声明一个隐式解析可选类型生命周期

一个隐式解析可选类型其实就是一个普通的可选类型,可是能够被当作非可选类型来使用,并不须要每次都使用解析来获取可选值。下面的例子展现了可选类型 String 和隐式解析可选类型 String 之间的区别:

let name: String? = "xiaoming."
let studentName: String = name!  // 须要感叹号来获取值

let city: String! = "Shanghai."
let studentCity: String = city // 不须要感叹号
复制代码

注意:
若是一个变量以后可能变成nil的话请不要使用隐式解析可选类型。若是你须要在变量的生命周期中判断是不是nil的话,请使用普通可选类型。

相关文章
相关标签/搜索