核心提示:1、定义可选项? 定义可选项!对可选项解包,强行解包不同类型的值,不能直接运算!如果没有值是 nil 不是任何数据类型,不能参与计算!强行解包 - 从可选值中强行获取对应的非空值,如果值是 nil,就...
1、定义可选项
‘?’ 定义可选项
‘!’对可选项解包,强行解包
不同类型的值,不能直接运算!如果没有值是 nil 不是任何数据类型,不能参与计算
‘!’强行解包 - 从可选值中强行获取对应的非空值,如果值是 nil,就会崩溃!
// 定义:‘?’用来定义 y 是一个可选的Int类型,可能没有值,也可能是一个整数 let y: Int? = 20 print(y!) // 定义模型属性的时候,如果是对象,通常是可选的,使用? var vipIcon: UIImage?
2、as 类型转换
1>、as?/as! 直接根据前面的返回值决定:前面的是可选的,就加 ? ,前面不是可选的就加 ! 号
2>、if let / guard let 判断语句,一律使用 as?
// MARK: - 控制器跳转方法 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 因为 segue.destination 不是可选值,所以 as 后面跟 ! let vc = segue.destination as! XZDetailViewController if let indexpath = sender as? IndexPath { // indexPath 一定有值 vc.person = personLists[indexpath.row] // 刷新指定行 self.tableView.reloadRows(at: [indexpath], with: .automatic) } }
3、闭包回调
在 OC 中执行 block 前都需要判断是否有值,否则会崩溃!,
Swift 中 的闭包要使用可选解包
// 定义闭包 -> 实现回调 // var completion: ()->()? 错误 var completion: (()->())? // 调用 -> ? 可选解包(如果闭包为 nil,就什么也不做!),如果没有添加 ? ,Xcode 会帮助修订,添加一个 !(强制解包),但是一定不要用 ‘!’ completion?()
4、可选解包
// ! 是强制解包,在参与计算的时候,需要使用强制解包;
// 代码中的 ? 都是 ‘可选’解包,只用来发送消息,不参与计算;
// 所有的 ? 都是 Xcode 自动添加的!
var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // 1.创建window window = UIWindow() window?.backgroundColor = UIColor.white // 2.设置根控制器 window?.rootViewController = XZMainViewController() // 3.让window可见 window?.makeKeyAndVisible() return true }
?? 运算符
?? 运算符用于判断 变量/常量 的数值是否是 nil ,如果是则使用后面的值替代;在Swift开发中, ?? 能够简化代码的编写。
// MARK - 可选项使用 ?? 的判断 func controlFlow3(x: Int?, y: Int?) { /** ?? 是一个简单的三目 - 如果有值,使用值;如果没有值,使用 ?? 后面的值替代 */ print((x ?? 0) + (y ?? 0)) let name: String? = "张三" // ?? 操作符号的优先级'低',在使用的时候最好加上小括号包裹 print("Hello" + (name ?? "Anyone")) // 打印结果:Hello张三 let name2: String? = nil print("Hey" + (name2 ?? "嗯哼")) // 打印结果:Hey嗯哼 }