Swift的可选类型Optional

1、Optional类型的概念

可选类型用来表示"有一个值,它等于x或者根本没有值"。当我们遇到Optional类型时,就会明显知道这里的值可能为nil,我们必须谨慎处理。

2、Optional类型的实现

Swift 复制代码
var optionalInteger: Int?
//或者
var optionalInteger: Int!

其中?和!都是可选类型的语法

3、Optional类型的本质

Optional其实是个枚举(enum)(严格来讲:应该是enum和泛型为基础的高阶抽象类型),分别是None和Some(T),如果可选类型为nil就会命中None的Case。

Swift 复制代码
enum Optional<T> : NilLiteralConvertible, Reflectable {  
        case None  
        case Some(T)  
 
        //...
}

如果命中Some(T)的Case,就会得到一个"包装"后的值(a wrapped value),如果想要拿到真正的value,就需要"拆包",否则你会得到的是Optional(value)。

4、Optional类型的运用(拆包)

可选绑定

可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

可以使用可选绑定来判断Optional是否包含值。

如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false。

基本语法:

Swift 复制代码
if let constantName = someOptional {
    statements
}

示例:

Swift 复制代码
var myString:String?
myString = "Hello, Swift!"
if let yourString = myString {
   print("myString 值为 - \(yourString)")
}else{
   print("myString 值为 nil")
}

强制解包

Optional是对其他类型的一层包装,可以将它理解为一个盒子

  • 如果为nil,那么它是个空盒子
  • 如果不为nil,那么盒子里装的是被包装类型的数据
  • 如果要从Optional中取出被包装的数据,需要使用感叹号!进行强制解包
  • 如果对值为nil的Optional进行强制解包,将会产生运行时错误。
Swift 复制代码
var myString:String?
myString = "Hello, world!"
if myString != nil {
   // 强制解析
   print( myString! )
}else{
   print("myString 值为 nil")
}

可选类型不能直接赋给其它类型,如Int?不能直接赋给Int型变量,要先解包,值为nil的可选类型不能解包

Swift 复制代码
var text: String? = "abc"
print(text)     //输出结果为Optional("abc")
print(text!)    //输出结果为abc
var a:String
a = text!       //强制解包

隐式拆包

隐式解包直接在定义时加!

对于会在viewDidLoad进行初始化的变量,可以直接定义为var str: String!,称为隐式拆包,在进行操作的时候也需要添加!进行拆包。

Swift 复制代码
let text:String! = "abc"    //text的类型还是Optional
print(text)    //输出结果为Optional("abc")
var a:String
a = text    //隐式类型转换
print(a)    //输出结果为abc

!和?的区别

?的使用场景:

  • 声明Optional值变量
  • 在对Optional值操作中,用来判断是否能响应后面的操作

!的使用场景:

  • 强制对Optional值进行拆包
  • 声明隐式拆包变量,一般用于类中的属性
相关推荐
游戏开发爱好者817 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
Anhty2 天前
2026 实测 4 款 AI 变声器|QQ 聊天伪装声线,告别僵硬假声
人工智能·功能测试·ios·智能手机·安卓
唔662 天前
flutter web iOS 在浏览器加载中文慢的问题
前端·flutter·ios
ZacJi2 天前
我为 DeepSeek Harness 写了一个 dsh-apple-mode 插件
ios·deepseek·vibecoding
2501_915921432 天前
抓包鹰 Traceeagle 解除证书绑定,SSL Pinning 解除
网络·网络协议·网络安全·ios·adb·https·ssl
大熊猫侯佩2 天前
Xcode 预览新升级:arguments 让界面调试井井有条
swiftui·xcode·swift
人月神话Lee3 天前
我做了个不要账号、不要定位权限的旅行 App,聊聊那些「不做」的决定
ios·ai编程·产品
2501_916007473 天前
Bundle ID 注册与管理 App ID 创建指南 命名规则 权限开关与删除注意事项
android·ios·小程序·https·uni-app·iphone·webview
大熊猫侯佩3 天前
WWDC26:把 SwiftUI Toolbar 真正握在手心里
swiftui·swift·apple