《Swift学习笔记》04 - 可选类型简介

介绍:Swift 语言由苹果公司在 2014 年推出,用来撰写 Mac OS 和 iOS 应用程序,并且Swift还是开源的,开源地址:https://github.com/apple/swift,同时附上官方博客地址:https://swift.org
目前Swift已经发展到了第五版本。显然苹果大有推翻 OC “江山”的意思.
今天就来初探一下Swift,看看究竟为何swift有这么大的能力。
参考内容:
Swift中文
YungFan老师

swift
1. 可选类型的介绍( options ):

开发中碰到nil在所难免.因此推出了可选类型。可以利用可选类型来处理值可能缺失的情况。

  • 可选项意味着:
    现在有一个值,他可以等于 x 或者 根本没有值。
  • 可选类型的取值:
    nil
    有值
  • 注意:
    在 C 和 Objective-C 中,没有可选项的概念。
    在 Objective-C 中有一个近似的特性,一个方法可以返回一个对象或者返回 nil。 nil 的意思是“缺少一个可用对象”。然而,他只能用在对象上,却不能作用在结构体,基础的 C 类型和枚举值上。对于这些类型,Objective-C 会返回一个特殊的值(例如 NSNotFound)来表示值的缺失。这种方法是建立在假设调用者知道这个特殊的值并记得去检查他。
    然而,Swift 中的可选项就可以让你知道任何类型的值的缺失,他并不需要一个特殊的值
2. 定义可选类型
  • 基本写法
    通过 Optional 来定义
let numOne : Optional = nil
  • 语法糖(常用)
let numTwo : String? = nil
let numThree : String?
let numThree2 : Any?
let url : URL? = URL(string: "https://www.abc.edu.cn")
  • 隐式解包写法
let name3 : String! = nil
let name4 : Any! = nil

注意⚠️: nil 不能用于非可选的常量或者变量,如果你的代码中变量或常量需要作用于特定条件下的值缺失,可以给他声明为相应类型的可选项。

Swift 中的 nil 和Objective-C 中的 nil 不同,在 Objective-C 中 nil 是一个指向不存在对象的指针。在 Swift中, nil 不是指针,他是值缺失的一种特殊类型,任何类型的可选项都可以设置成 nil 而不仅仅是对象类型。

  • 在下面的栗子中,试图利用初始化器将一个 String 转换为 Int :
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
print("convertedNumber = \(convertedNumber)")
// convertedNumber is inferred to be of type "Int?", or "optional Int"

可以看到输出的结果是 可选的Int,而不是Int

可选的 Int 写做 Int?,而不是Int 。问号明确了它储存的值是一个可选项,意思就是说它可能包含某些 Int 值,或者可能根本不包含值。(他不能包含其他的值,例如 Bool 值或者 String 值。它要么是 Int 要么什么都没有)

3. 可选类型的使用
// 定义可选类型
var string : Optional = nil

// 给可选类型赋值
// 错误写法:因此该可选类型中只能存放字符串
string = 123
// 正确写法:
string = "Hello world"

// 打印结果
print(string)
// 结果:Optional("Hello world")\n  因为是可选类型,所有会带Optional
4. If 语句以及强制展开(强制解包)

强制解包有两种:

  • 你可以利用 if 语句通过比较 nil 来判断一个可选中是否包含值。利用相等运算符 ( == )和不等运算符( != )。如果一个可选有值,他就“不等于” nil :
  • 如果你确定可选中包含值,那么你就可以在可选名字后面加上一个 ! 来获取值,这也就是可选值的强制解包。但是一旦可选值为 nil ,那么强制解包就会报错。所以在使用 ! 强制解包时必须确保可选项中包含一个非 nil 的值。
var string : Optional = " hello swift ! "

//方法一 :通过 If 来强制解包 相对而言更加的安全。
if string != nil {
    print(string!)
}

// 方法二 :当知道 可选值为非空的时候使用;
//!强制解包(显示解包)
print(string!)

// 当可选值为空的时候会报错
var string2 : Optional = nil
print(string2!) // 报错 EXC_BAD_INSTRUCTION
5. 可选项绑定
  • 可以使用可选项绑定来判断可选项是否包含值,如果包含就把值赋给一个临时的常量或者变量。可选绑定可以与 if 和 while 的语句使用来检查可选项内部的值,并赋值给一个变量或常量。

在 if 语句中,这样书写可选绑定:

if let constantName = someOptional { 
    statements 
} 

上面说到,类型的转换会被默认为 可选类型 ,我们可以通过可选类型的绑定来 展开 可选类型

let convertedNumber = Int(possibleNumber)
print("convertedNumber = \(convertedNumber)")

if let actualNumber = convertedNumber {
    print("actualNumber = \(actualNumber)")
}
print: actualNumber = 123,convertedNumber = Optional(123)

代码可以读作:
“如果 Int(possibleNumber) 返回的可选Int包含一个值,将这个可选项中的值赋予一个叫做 actualNumber 的新常量。”

常量和变量都可以使用可选项绑定,如果你想操作 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")
}
// Prints "4 < 42 < 100"
 
if let firstNumber = Int("4") {
    if let secondNumber = Int("42") {
        if firstNumber < secondNumber && secondNumber < 100 {
            print("\(firstNumber) < \(secondNumber) < 100")
        }
    }
}
// Prints "4 < 42 < 100"
  • 注意:
    使用 if 语句创建的常量和变量只在if语句的函数体内有效。相反,在 guard 语句中创建的常量和变量在guard 语句后的代码中也可用。
guard let str = Int(possibleNumber) else{
    return
}
print(str)
6. 隐式展开可选项(隐式解包)

如上所述,可选项明确了常量或者变量可以“没有值”。可选项可以通过if语句来判断是否有值,如果有值的话可以通过可选项绑定来获取里边的值。
有时在一些程序结构中可选项一旦被设定值之后,就会一直拥有值。在这种情况下,就可以去掉检查的需求,也不必每次访问的时候都进行展开,因为它可以安全的确认每次访问的时候都有一个值。
这种类型的可选项被定义为隐式展开可选项。通过在声明的类型后边添加一个叹号( String! )而非问号( String? ) 来书写隐式展开可选项
隐式展开可选项是后台场景中通用的可选项,但是同样可以像非可选值那样来使用,每次访问的时候都不需要展开。下面的栗子展示了在访问被明确为 String 的可选项展开值时,可选字符串和隐式展开可选字符串的行为区别:

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
 
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark

你可以把隐式展开可选项当做在每次访问它的时候被给予了自动进行展开的权限,你可以在声明可选项的时候添加一个叹号而不是每次调用的时候在可选项后边添加一个叹号。

  • 注意
    如果你在隐式展开可选项没有值的时候还尝试获取值,会导致运行错误。结果和在没有值的普通可选项后面加一个叹号一样。

你可以像对待普通可选一样对待隐式展开可选项来检查里边是否包含一个值:

if assumedString != nil {
    print(assumedString)
}

你也可以使用隐式展开可选项通过可选项绑定在一句话中检查和展开值:

if let definiteString = assumedString {
    print(definiteString)
}
// prints "An implicitly unwrapped optional string."
  • 注意
    不要在一个变量将来会变为 nil 的情况下使用隐式展开可选项。如果你需要检查一个变量在生存期内是否会变为 nil ,就使用普通的可选项。

可选类型的介绍就到这里了。有什么不足的地方欢迎补充。文章大多数内容来自:

Swift中文
YungFan老师
再次感谢!

求职广告:本人实习生,现在急需一份工作,杭州南京合肥的都可以。对我感兴趣的可以私聊我 0.0。谢谢~~~

你可能感兴趣的:(《Swift学习笔记》04 - 可选类型简介)