详解Swift 可选(Optionals)类型

Swift是一种适用于iOS和OS X应用的全新编程语言,它建立在最好的C和Objective-C语言之上,并且没有C语言的兼容性限制。Swift采用安全的编程模式,增加了现代功能使编程更容易、更灵活、更有趣。Swift以成熟且备受宠爱的Cocoa和Cocoa Touch框架为支撑,这是一个重新构想软件开发的机会。

Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示”那儿有一个值,并且它等于 x “或者”那儿没有值”。

Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:

var optionalInteger: Int?
var optionalInteger: Optional(Int)

在这两种情况下,变量 optionalInteger 都是可选整数类型。注意,在类型和 ?之间没有空格。

Optional 是一个含有两种情况的枚举,None 和 Some(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候,要确保用括号给 ? 操作符一个合适的范围。例如,声明可选整数数组,应该写成 (Int[])? 写成 Int[]? 会报错。

当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。

可选项遵照 LogicValue 协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型T?包含类型为T的任何值(也就是说它的值是 Optional.Some(T) ),这个可选类型等于 true,反之为 false。

如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示:

optionalInteger = 42
optionalInteger! // 42

使用操作符!去获取值为nil的可选变量会有运行时错误。

你可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。

让我们来详细看下以下实例来了解 Swift 中可选类型的应用:

import Cocoa

var myString:String? = nil

if myString != nil {
   print(myString)
}else{
   print("字符串为 nil")
}

以上程序执行结果为:

字符串为 nil

可选类型类似于Objective-C中指针的nil值,但是nil只对类(class)有用,而可选类型对所有的类型都可用,并且更安全。

强制解析

当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示”我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)。

实例如下:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
  print(myString)
}else{
  print("myString 值为 nil")
}

以上程序执行结果为:

Optional("Hello, Swift!")

强制解析可选值,使用感叹号(!):

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
  // 强制解析
  print( myString! )
}else{
  print("myString 值为 nil")
}

以上程序执行结果为:

Hello, Swift!

自动解析

你可以在声明可选变量时使用感叹号(!)替换问号(?)。这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。

实例如下:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {
  print(myString)
}else{
  print("myString 值为 nil")
}

以上程序执行结果为:

Hello, Swift!

可选绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

像下面这样在if语句中写一个可选绑定:

if let constantName = someOptional {
   statements
}

让我们来看下一个简单的可选绑定实例:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {
  print("你的字符串值为 - \(yourString)")
}else{
  print("你的字符串没有值")
}

以上程序执行结果为:

你的字符串值为 - Hello, Swift!

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/14432.html

(0)
晴川运维晴川运维
上一篇 2025年10月6日
下一篇 2025年10月6日

相关推荐

  • Linux LVM逻辑卷管理机制(硬盘分区管理机制)

    我们在实际使用 linux 服务器的时候,总会有一个让人头疼的问题,随着业务的增加,文件系统负载会越来越大,当到了空间不足的情况时,如果我们还在使用传统的分区方式管理硬盘,就不得不…

    Linux系统 2025年7月6日
  • MYSQL5.7与MariaDB10.3区别

    大家都知道MariaDB是MySQL源代码的一个分支,但是他们两个之间有什么不能呢?本篇文章重点为大家分享一下MYSQL5.7与MariaDB10.3区别。 二者基础架构是一样的,…

    Linux系统 2025年10月4日
  • Linux下查看服务启动或者关闭具体方法

    Linux中如何查看服务是否启动或者关闭?本篇文章为大家分享一下Linux下查看服务启动或关闭具体方法,有需要的小伙伴可以参考一下。 1. # ps aux | grep 服务名称…

    Linux系统 2025年7月9日
  • CSS Fonts(字体)设置方法

    使用css的目的就是让网页具有美观一致的页面,另外一个最重要的原因是内容与格式分离,本篇文章重点为大家讲解一下CSS字体设置方法。 serif和sans-serif字体之间的区别 …

    Linux系统 2025年6月16日
  • redhat6.5 通过vnc服务访问远程桌面

    VNC 服务是一个自由开源软件,采用RFB通信协议。RFB (“remote 帧缓存 “) 是一个远程图形用户的简单协议,因为它工作在帧缓存级别上,所以它可以应用于所有的窗口系统,…

    Linux系统 2025年10月19日
  • 通过Go语言制作二维码

    本篇文章重点为大家讲解一下使用Go语言制作二维码具体方法,有需要的小伙伴可以参考一下。 Go语言生成二维码图片 使用Go语言编程时,生成任意内容的二维码是非常方便的,因为我们有go…

    Linux系统 2025年10月24日
  • Redis特殊数据类型:HyperLogLog使用方法

    redis是一个开源的,先进的key-value存储,属于非关系型缓存数据库,通常被称为数据结构服务器。Redis 中有三种特殊数据类型:Bitmaps、HyperLogLog、G…

    Linux系统 2025年6月4日
  • 细说SQLite中表达式

    SQLite是一种C语言库,它实现了一个 小型, 快速, 自包含, 高可靠性, 功能齐全的SQL数据库引擎。SQLite是世界上最常用的数据库引擎。SQLite内置于所有手机和大多…

    Linux系统 2025年6月8日
  • D语言基础教程

    D语言是一种编程语言,具备多范型,例如面向对象、指令式。由沃尔特·布莱特和安德烈·亚历山德雷斯库所开发,起源自C++,深受C++的影响,然而其不是C++的变种,而是重新设计来自C+…

    Linux系统 2025年10月25日
  • 详解zookeeper ACL

    zookeeper 的 ACL(Access Control List,访问控制表)权限在生产环境是特别重要的。ACL 权限可以针对节点设置相关读写等权限,保障数据安全性。perm…

    Linux系统 2025年6月8日

发表回复

登录后才能评论