阅读 659

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

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

元组(tuples)

元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

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

  • 元组的定义
    • 定义元组时,可以在元组中命名各个元素
    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 处理任何类型,判断它们是否有值

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 值也可能不包含值。

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 比较来判断一个可选值是否包含值,使用==!= 来执行比较

  • 如果可选类型有值,它将不等于 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语句一起使用,以检查可选中的值,并将该值提取到常量或变量中,作为单个操作的一部分

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

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

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

  • 单个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的话,请使用普通可选类型。

文章分类
iOS
文章标签