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值进行拆包
  • 声明隐式拆包变量,一般用于类中的属性
相关推荐
川石课堂软件测试14 小时前
Android和iOS APP平台测试的区别
android·数据库·ios·oracle·单元测试·测试用例·cocoa
liusheng14 小时前
Capacitor + React 的 iOS 侧滑返回手势
前端·ios
大熊猫侯佩14 小时前
Swift 6.2 列传(第十七篇):钟灵的“雷电蟒”与测试附件
单元测试·swift·apple
2501_9159184114 小时前
除了 Perfdog,如何在 Windows 环境中完成 iOS App 的性能测试工作
android·ios·小程序·https·uni-app·iphone·webview
七月巫山晴15 小时前
【iOS】NSString&NSRange&NSCharacterSet
ios·cocoa·iphone
h-189-53-67120716 小时前
2026(原创)Guideline 4.3(a) - Design - Spam苹果上架iOS审核被拒AppStore卡审解决办法思路
ios
杨武博17 小时前
ios 启动图不生效问题
ios
2501_9151063219 小时前
常见 iOS 抓包工具的使用方式与组合思路
android·ios·小程序·https·uni-app·iphone·webview
SY_FC19 小时前
niapp开发的 H5 被app嵌套,H5调用ios和安卓方法
android·ios·cocoa
东坡肘子20 小时前
AT 的人生未必比 MT 更好 -- 肘子的 Swift 周报 #118
人工智能·swiftui·swift